java中的下界泛型即使在传递超类时也不会编译

java中的下界泛型即使在传递超类时也不会编译,java,bounded-wildcard,Java,Bounded Wildcard,List通配符下限为类型参数指定下限,而不是为列表的可接受类型指定下限。类型参数可以是像IOException一样具体的东西,但也可以是像我们所能得到的那样一般的:Object 添加异常时,项的类型作为项太一般,因为类型参数可能对它太具体了—它可能是IOException。编译器不允许您将异常添加到可能只需要IOExceptions的内容中,因此它会生成错误 FileNotFoundException不会出现这种情况,因为无论类型参数有多具体,它都不会比IOException(下界)更具体,因此

List通配符下限为类型参数指定下限,而不是为
列表的可接受类型指定下限。类型参数可以是像
IOException
一样具体的东西,但也可以是像我们所能得到的那样一般的:
Object

添加
异常
时,项的类型作为项太一般,因为类型参数可能对它太具体了—它可能是
IOException
。编译器不允许您将
异常
添加到可能只需要
IOException
s的内容中,因此它会生成错误


FileNotFoundException
不会出现这种情况,因为无论类型参数有多具体,它都不会比
IOException
(下界)更具体,因此a是
IOException
的子类,在所有情况下都是合法的,因此编译器允许它。

myList引用的列表可以是
List
List
列表
。第2行没有编译,因为我们可能有一个
列表
和 异常对象不适合在其中

File NotFoundException
也可以添加到这三种类型中的任何一种。这很棘手,因为
FileNotFoundException
IOException
的子类,关键字为
super

编译器查看引用类型:
ListThis:

编译是因为
FileNotFoundException
IOException
,就像它是
异常一样,因此它满足
myList
的限制

这:

不编译,因为编译器不知道列表的确切类型(它不检查分配给变量的是什么,它只查看其声明的类型),所以它不知道分配给它的列表是否具有与超级类型
IOException
匹配的类型,但不知道
Exception

如果在
Exception
IOException
之间的层次结构中有一个中间类,就会发生这种情况。如果列表实际具有该类型,
Exception
可能与分配给
myList
的实际列表的范围不匹配

编译器不检查完整的类层次结构,也不检查分配了什么。它只执行基本检查,总是避免运行时错误


通常情况下,如果“逻辑上”没有会导致错误的代码路径,但编译仍然失败,则情况也是如此。

很抱歉,我有点困惑。在这里写
?super IOException
我指定了一个下限,即列表只能包含
IOException
的超类,不能包含它的任何子类。因此,编译器应该允许添加
Exception
对象,并在添加
FileNotFoundException
时给出错误,正如我所解释的,您误解了下限是什么。它是类型参数的下限,而不是列表可能包含的项的下限。您可以将
列表
列表
分配给
myList
。但无论哪种方式,都可以将
FileNotFoundException
添加到
myList
,因为
FileNotFoundException
是任何可能类型参数的子类型。但是您不能将
异常添加到
myList
,因为类型参数可能是
IOException
List<? super IOException> myList =  new ArrayList<Exception>();
myList.add(new Exception());     //Line 2 This line do not compile
myList.add(new FileNotFoundException());  //Line 3 This compiles
List<Object>
List<Exception>
List<IOException>
myList.add(new FileNotFoundException());
myList.add(new Exception());