繁体   English   中英

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

[英]Java generic interface with type constraint vs c# generics

我遇到了一些类似于以下的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时,它正在寻找与接口中的具体方法匹配的方法,并且不会抱怨,因为它会找到满足其所需内容的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM