Java泛型。类型不匹配:无法从对象转换为

时间:2014-07-03 21:10:47

标签: java generics

我有以下通用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()的类型相同。我已经准备好忍受它,但我想了解原因。为什么会有转换?

1 个答案:

答案 0 :(得分:3)

这是关于原始类型的有趣部分之一。您不仅没有对原始类型本身进行通用检查,而且还会导致对所有交互代码的通用检查也被跳过。

因此,当您使用原始类型A时,您在List<A>内定义的A实际上已删除为List,以便getList返回原始类型Listget(0)将返回Object

这也是您获得“未经检查的转化”警告的原因。 getList()会返回List,而不是List<A>。因此,将原始类型List分配给List<A>会产生未经检查的转化警告。

  

变量sameList与方法getList()

的类型相同

所以你真的错了,这里。 sameList有一个不同的类型作为原始类型getList()的{​​{1}}的返回类型。

要解决此问题,您需要在代码中参数化A的所有用途。