以下代码在t3行中出现编译错误:
public <E> List<E> getList() { return new ArrayList<E>(); } public <T> void first() { List<T> ret = new ArrayList<T>(); List<T> list = getList(); T t1 = ret.get(0); T t2 = list.get(0); T t3 = getList().get(0); }
错误消息是: 类型不匹配:无法从对象转换为T
我知道我可以使用强制转换或手动绑定来解决问题,我的问题是: 编译器进行自动绑定是否如此困难,是否会失败?
编辑:添加了错误消息。
编辑:添加了另一个示例如何不会发生该错误。
编辑:删除了第二个示例,因为它令人困惑,使问题更加清楚。
在第一种情况下,您有两个具有名为的类型参数的泛型方法T,但是这些类型参数是不同的,因此让我们为其分配不同的名称:
T
public <E> List<E> getList() { ... } public <T> void first() { ... }
然后,它的工作方式如下:
的元素List<T>(即type的对象T)分配给type的变量T,因此一切正常:
List<T>
List<T> ret = new ArrayList<T>();
T t1 = ret.get(0);
首先,将类型的对象List<E>分配给List<T>。该语句工作得很好,因为类型参数E是从赋值左侧的类型推断出来的,所以T= E。然后,它与前面的情况一样工作:
List<E>
E
List<T> list = getList();
T t2 = list.get(0);
在这种情况下,您尝试将type的对象分配给type E的变量T,但是E无法进行推断并因此假定为Object,因此分配失败:
Object
T t3 = getList().get(0);
您可以通过手动绑定E来解决此问题T:
T t3 = this.<T>getList().get(0);
在泛型类的情况下,TestGenerics<T>您没有两个独立的类型参数,因此T这两种方法都引用相同的类型。
TestGenerics<T>