声明一个类是否为泛型为什么会影响该类的其他泛型方法(与该类上的泛型参数不同)

JDK8,代码如下:

public class Foo<E> {

    public <T extends List> T get(T list) {
        return null;
    }

    public void pass(Foo<?> foo) {
        ArrayList arrayList = foo.get(new ArrayList());
    }

    public void broken(Foo foo) {
        // 编译器报错 Incompatible types,无法转化为ArrayList
        ArrayList arrayList = foo.get(new ArrayList());
    }
}

Foo的泛型参数Eget方法的泛型参数T不同,按理来说是否声明Foo为泛型应该不影响get方法啊.

这是JAVA作者由于某种原因有意为之,还是编译器的推断能力不足.

阅读 2k
1 个回答

这个是泛型的边界问题,java编译器不允许不安全的类型转换。

第一个方法参数定义了 Foo<?>,告诉了编译器,类的泛型允许接受任何类型,因此可以进行安全的类型转换(其实是接受OBJECT)

第二个方法没有指定Foo的泛型类型,因此这里会存在类型转换的不确定性。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题