作为一名熟练的c#程序员,Java类型参数推理规则中有什么陷阱等着我

本文关键字:推理规则 类型参数 Java 等着我 陷阱 什么 程序员 一名 | 更新日期: 2023-09-27 17:58:40

或者换句话说

泛型类型的类型参数推理的主要区别是什么在C#和Java之间?

我正在寻找一个可以在几分钟内被熟练的C#开发人员阅读和理解的答案。

作为一名熟练的c#程序员,Java类型参数推理规则中有什么陷阱等着我

Java与;C#泛型是指Java泛型由编译器强制执行,并根据需要插入所需的强制转换。字节码不引用泛型类型,这被称为"类型擦除"。

在C#中,泛型存在于中间语言中,因此不存在擦除。因此,您可以使用反射来读取泛型类型参数。

请参阅此相关问题:

C#和Java中的泛型有什么区别。。。和C++中的模板?

我发现人们最困惑的一件事是:如果类型参数只出现在返回类型中,编译器就无法推断它。

<T> T foo();
foo(); // fail, no idea what T is

这个例子是可以理解的,但以下不是

void bar(String s){..}
bar( foo() ); // fail, compiler can't infer T=String

编译器不能推断出这样一个简单的案例,这让人们非常不安。

只有在两种情况下(都是"赋值转换"),Java才能推断出T

String s = foo(); // ok, T=String
String doo()
{
    return foo(); // ok, T=String
}

(当它编译时,这是非常危险的。foo()怎么知道它应该返回String?由于类型擦除,它在运行时无法访问T。如果Java即使在这两种情况下也不允许推理,那它会更好。)

当然,当推理失败时,您总是可以提供显式类型的参数。