请注意下面的代码无法编译,方法结果分配失败:String s = a.method("abc");
.
编译错误:incompatible types: java.lang.Object cannot be converted to java.lang.String
但是,当改变A a
时至A<?> a
或发送至A<Object> a
,编译通过。
* 请注意类型 <T>
该方法与类型 <O>
不同在类里面。
知道编译错误是什么吗?另外,为什么变量a
中的通用定义解决了编译问题吗?
class A<O>
{
O something;
<T> T method(T t)
{
return t;
}
static void testJavaStrangeGenericDefinitionBehavior()
{
A a = null;
String s = a.method("abc");
}
}
最佳答案
A a = null;
应该是:
A<String> a = null; // or better yet, new A<String>();
尽管如此,您可以用任何类替换 String
,因为正如您所说,T
和 O
泛型是不同的类型。
一旦删除泛型参数,您就会丢失方法调用中的所有泛型,这本质上相当于调用:
Object method(Object t);
关于Java 泛型 - 如果调用的方法中不存在类的泛型类型,为什么会出现 "incompatible types"编译错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53655504/