我遇到了一些与此类似的 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”中缺少类型声明。来自 C# 世界,这让我感到惊讶,因为你不能在 C# 中做到这一点。你必须写这样的东西:
public class Test : ITest<IOne, ITwo>
我知道 Java 泛型与 C# 泛型有很大不同,但我想更好地了解允许上述代码编译的 Java 代码中发生了什么?是编译器的类型推断吗?原始类型 IOne 和 ITwo 是否用于测试类? http://docs.oracle.com/javase/tutorial/java/generics/rawTypes.html
谢谢。
最佳答案
当java编译时
T1 扩展了 IOne
它将 T1 的所有实例替换为 IOne
所以
public boolean handle(T1 value1) {
return false;
}
变成了
public boolean handle(IOne value1) {
return false;
}
所以实际的接口(interface)Itest是
public interface ITest {
boolean handle(IOne value1);
boolean handle(ITwo value2);
}
它可以做到这一点,因为 T1 的实例始终能够分配给 IOne,而 T2 的实例始终能够分配给 ITwo。
编译 Test 时,它会寻找与接口(interface)中的具体方法相匹配的方法,并且不会提示,因为它会找到满足其所寻找内容的方法。
关于c# - 具有类型约束的 Java 泛型接口(interface)与 C# 泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19352845/