具有类型约束的Java通用接口与c#泛型

时间:2013-10-14 02:53:14

标签: c# java generics interface constraints

我遇到了类似的一些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”中缺少类型声明。来自c#世界,这让我感到惊讶,因为你不能在c#中做到这一点。你必须写一些类似的东西:

public class Test : ITest<IOne, ITwo>

我理解Java泛型与c#泛型有很大不同,但我想更好地理解允许上述代码编译的Java代码中发生了什么?它是编译器的类型推断吗?原始类型IOne和ITwo是否用于Test类? http://docs.oracle.com/javase/tutorial/java/generics/rawTypes.html

感谢。

1 个答案:

答案 0 :(得分: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时,它正在寻找与接口中的具体方法相匹配的方法,并且不会抱怨,因为它找到的方法可以满足它的需求。