作为一名熟练的c#程序员,Java类型参数推理规则中有什么陷阱等着我
本文关键字:推理规则 类型参数 Java 等着我 陷阱 什么 程序员 一名 | 更新日期: 2023-09-27 17:58:40
或者换句话说
泛型类型的类型参数推理的主要区别是什么在C#和Java之间?
我正在寻找一个可以在几分钟内被熟练的C#开发人员阅读和理解的答案。
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即使在这两种情况下也不允许推理,那它会更好。)
当然,当推理失败时,您总是可以提供显式类型的参数。