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

本文关键字:泛型接口 泛型 Java 类型 约束 | 更新日期: 2023-09-27 18:35:16

我遇到了一些类似的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 泛型接口与 c# 泛型

当 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 时,它会查找与接口中的具体方法匹配的方法,并且不会抱怨,因为它会找到满足其所需内容的方法。