误解或可能违反Java中的泛型子类型规则



代码片段来自OSP Java认证指南

List<? super IOException> exceptions = new ArrayList<Exception>();
exceptions.add(new Exception());  // DOES NOT  COMPILE
exceptions.add(new IOException());
exceptions.add(new FileNotFoundException());

我应该提醒一下我们遵守的规则。

下界是当你指定(? super Field)意味着参数可以是任何Field或Field的超类。

通过此规则,? super IOException意味着我们可以添加任何声明类为IOException或其超类的对象。

那么为什么我们不能在列表中添加Exception对象,但我们可以添加FileNotFoundException对象,这是IOException类的子类型。

也许我误解了声明的类和类或泛型边界的实例,但我不确定。

你混淆了两个不同的概念:

当我们说? super IOException意味着你可以做以下分配:

List<? super IOException> foo = new ArrayList<IOException>();  // IOException is a "superclass" of IOException
List<? super IOException> foo = new ArrayList<Exception>();   // Exception is a superclass of IOException
List<? super IOException> foo = new ArrayList<Object>();   // Object is a superclass of IOException
List<? super IOException> foo = new ArrayList<FileNotFoundException>();   // Compilation error as FileNotFoundException is a not superclass of IOException

和超类引用(IOException)可以继承子类(FileNotFoundException)的对象

List<? super IOException> exceptions = new ArrayList<Exception>();
exceptions.add(new Exception());  // DOES NOT  COMPILE as It's Super class to IOException
exceptions.add(new IOException()); // IOException is a "superclass" of IOException
exceptions.add(new FileNotFoundException()); // IOException is a "superclass" of FileNotFoundException

相关内容

  • 没有找到相关文章

最新更新