我有以下通用Java类:
class A<T> {
List<A> list;
List<A> getList() {
return list;
}
}
当我尝试获取列表的第一个元素时
A a = new A();
A b = a.getList().get(0);
我有编译错误:
Type mismatch: cannot convert from Object to A
如果我介绍一个中介清单:
A a = new A();
List<A> sameList = a.getList();
A b = sameList.get(0);
错误消失,但出现警告:
Type safety: The expression of type List needs unchecked conversion to conform to List<A>
变量sameList
与方法getList()
的类型相同。我已经准备好忍受它,但我想了解原因。为什么会有转换?
答案 0 :(得分:3)
这是关于原始类型的有趣部分之一。您不仅没有对原始类型本身进行通用检查,而且还会导致对所有交互代码的通用检查也被跳过。
因此,当您使用原始类型A
时,您在List<A>
内定义的A
实际上已删除为List
,以便getList
返回原始类型List
和get(0)
将返回Object
。
这也是您获得“未经检查的转化”警告的原因。 getList()
会返回List
,而不是List<A>
。因此,将原始类型List
分配给List<A>
会产生未经检查的转化警告。
变量sameList与方法
的类型相同getList()
所以你真的错了,这里。 sameList
有一个不同的类型作为原始类型getList()
的{{1}}的返回类型。
要解决此问题,您需要在代码中参数化A
的所有用途。