代码片段来自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