我遇到了一些类似于以下的Java代码:
public interface ITest<T1 extends IOne,T2 extends ITwo> {
boolean handle(T1 value1);
boolean handle(T2 value2);
}
public interface IOne {}
public interface ITwo {}
然后执行ITest:
public class Test implements ITest {
@Override
public boolean handle(IOne value1) {
return false;
}
@Override
public boolean handle(ITwo value2) {
return false;
}
}
请注意,“测试实现ITest”中缺少类型声明。来自ac#世界,这让我感到惊讶,因为您无法在c#中做到这一点。您将必须编写如下内容:
public class Test : ITest<IOne, ITwo>
我知道Java泛型与c#泛型有很大不同,但是我想更好地理解Java代码中发生的事情,这些代码允许上述代码进行编译?它是编译器的类型推断吗?是否将原始类型IOne和ITwo用于Test类?http://docs.oracle.com/javase/tutorial/java/generics/rawTypes.html
谢谢。
当Java编译时
T1 extends IOne
它将所有T1实例替换为IOne
所以
public boolean handle(T1 value1) {
return false;
}
变成
public boolean handle(IOne value1) {
return false;
}
所以实际的接口Itest是
public interface ITest {
boolean handle(IOne value1);
boolean handle(ITwo value2);
}
这样做是因为T1的实例将始终能够分配给IOne,而T2的实例将始终能够分配给ITwo。
编译Test时,它正在寻找与接口中具体方法匹配的方法,并且不会抱怨,因为它会找到满足其所要查找内容的方法。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句