下面的代码在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
我知道我可以使用强制转换或手动绑定(bind)来解决问题,我的问题是:编译器做自动绑定(bind)有那么难吗,有没有失败的情况?
编辑:添加了错误信息。
编辑:添加了另一个错误未发生的示例。
编辑:删除了第二个示例,因为它令人困惑,使问题更加清晰。
最佳答案
在第一种情况下,您有两个类型参数名为 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
类型的变量,但是E
无法推断,因此假定为Object
,所以赋值失败:T t3 = getList().get(0);
您可以通过绑定(bind)
E
来修复此行为至T
手动:T t3 = this.<T>getList().get(0);
对于泛型类 TestGenerics<T>
你没有两个独立的类型参数,所以 T
在这两种方法中指的是相同的类型。
关于java - 编译器对泛型类型的自动绑定(bind)(类型推断),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4143796/