c# - 具有类型约束的 Java 泛型接口(interface)与 C# 泛型

标签 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;
    }
}

请注意“测试实现 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/

相关文章:

c# - 如何使用 BeginReceive 接收多个部分?

c# - ASP.NET Web API - 未设置 ActionFilter 属性

java - Class<V> 可以对泛型类型进行多重限制吗?

c# - 使用通用接口(interface)进行动态转换

c# - 将 C# 数据结构存储到 SQL 数据库中

c# - Multi-Tenancy Asp.net Core网站中基于参数的JWT认证

java - 是否可以通过 Java API 从插件管理 jira webhooks?

java - 由于转义序列错误,无法在 Java 中使用正则表达式,如何消除错误

Java 应用程序不再在 OS X 10.11 El Capitan 下运行

ios - 如何在 Swift 中向泛型类型添加类型方法?