首页 > 解决方案 > java中的下界泛型即使在传递超类时也不会编译

问题描述

List<? super IOException>表示列表可以包含IOException对象或任何属于.super类的对象IOException。那么为什么下面的第 2 行不能编译呢?

在第 3 行FileNotFoundException中也不superIOException. 那为什么会编译呢?

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

标签: javabounded-wildcard

解决方案


通配符下限指定类型参数的下限,而不是可接受的List. type 参数可以像 一样具体IOException,但也可以像我们能得到的那样通用:Object.

添加 时Exception,项目的类型作为项目过于笼统,因为类型参数可能对它来说过于具体——它可能是IOException. 编译器不允许您将 an 添加Exception到可能只需要IOExceptions 的内容中,因此它会生成错误。

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


推荐阅读