1

我遇到了一些类似的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;
    }
}

请注意“Test implements 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

谢谢。

4

1 回答 1

1

java编译的时候

T1 extends IOne

它用 IOne 替换 T1 的所有实例

所以

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 时,它正在寻找与接口中的具体方法匹配的方法,并且不会抱怨,因为它找到了满足它正在寻找的方法。

于 2013-10-14T03:06:50.367 回答