java - 编译器对泛型类型的自动绑定(bind)(类型推断)

标签 java generics binding type-inference

下面的代码在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() { ... }

然后它的工作原理如下:

  1. List<T> 的一个元素(即 T 类型的对象)被分配给 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. 在这种情况下,您尝试分配类型为 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/

相关文章:

java - 无法对非静态方法进行静态引用 (Android getApplicationContext())

java - 如何在 Java 泛型中使用自定义类型

wpf - 文本框和按钮 - 绑定(bind)和命令

wpf - 来自 ToolTip 或 ContextMenu 的 RelativeSource 绑定(bind)

java - DI 容器与工厂

java - 使用 libgdx 的类的单元测试

java - 嵌套 If 语句失败

generics - 是否可以通过 Rust 中的模式匹配来解压通用元组?

c# - 何时使用泛型和类型检查?

c# - Ninject - 自动绑定(bind)从通用基类继承的程序集中的所有类(后者又实现通用接口(interface))