小编典典

编译器自动绑定泛型类型(类型推断)

java

以下代码在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

我知道我可以使用强制转换或手动绑定来解决问题,我的问题是: 编译器进行自动绑定是否如此困难,是否会失败?

编辑:添加了错误消息。

编辑:添加了另一个示例如何不会发生该错误。

编辑:删除了第二个示例,因为它令人困惑,使问题更加清楚。


阅读 277

收藏
2020-11-30

共1个答案

小编典典

在第一种情况下,您有两个具有名为的类型参数的泛型方法T,但是这些类型参数是不同的,因此让我们为其分配不同的名称:

public <E> List<E> getList() { ... }
public <T> void first() { ... }

然后,它的工作方式如下:

  1. 的元素List<T>(即type的对象T)分配给type的变量T,因此一切正常:

     List<T> ret = new ArrayList<T>();
    

    T t1 = ret.get(0);

  2. 首先,将类型的对象List<E>分配给List<T>。该语句工作得很好,因为类型参数E是从赋值左侧的类型推断出来的,所以T= E。然后,它与前面的情况一样工作:

     List<T> list = getList();
    

    T t2 = list.get(0);

  3. 在这种情况下,您尝试将type的对象分配给type E的变量T,但是E无法进行推断并因此假定为Object,因此分配失败:

      T t3 = getList().get(0);
    

您可以通过手动绑定E来解决此问题T

      T t3 = this.<T>getList().get(0);

在泛型类的情况下,TestGenerics<T>您没有两个独立的类型参数,因此T这两种方法都引用相同的类型。

2020-11-30