以下代码在 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);
}
错误信息是:类型不匹配:无法从 Object 转换为 T
我知道我可以使用强制转换或手动绑定来解决问题,我的问题是:编译器自动绑定这么难吗,有没有会失败的情况?
编辑:添加了错误消息。
编辑:添加了另一个如何不发生错误的示例。
编辑:删除了第二个示例,因为它令人困惑,使问题更加清晰。
在第一种情况下,您有两个带有类型参数的泛型方法,名为T
,但是这些类型参数是不同的,所以让我们为它们分配不同的名称:
public <E> List<E> getList() { ... }
public <T> void first() { ... }
然后它的工作原理如下:
-
的一个元素List<T>
(即类型的对象T
) 被分配给类型的变量T
,所以一切正常:
List<T> ret = new ArrayList<T>();
T t1 = ret.get(0);
-
首先,一个类型的对象List<E>
被分配给List<T>
。该语句工作正常,因为类型参数E
是从赋值左侧的类型推断出来的,所以T
= E
。然后它的工作方式与前面的情况一样:
List<T> list = getList();
T t2 = list.get(0);
-
在这种情况下,您尝试分配类型的对象E
到类型变量T
, but E
无法推断,因此假设为Object
,因此赋值失败:
T t3 = getList().get(0);
您可以通过绑定来修复此行为E
to T
手动:
T t3 = this.<T>getList().get(0);
对于泛型类TestGenerics<T>
你没有两个独立的类型参数,所以T
两种方法都指同一类型。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)