为什么前三行无法编译,而其余两行却编译了?这具体是如何工作的?
import java.util.*;
class HelloWorld {
public static void main(String[] args) {
//List<Number> ints = new ArrayList<Integer>(); DIDN'T compile
//List<Integer> nums = new ArrayList<Number>(); DIDN'T compile
//List<Object>nums = new ArrayList<Integer>(); DIDN'T compile
//List<? extends Number> nums = new ArrayList<Integer>(); compiled
//List<? super Number> nums = new ArrayList<Object>(); compiled
}
}`
前 3 行未编译,因为在 Java 中,不满足泛型类型或协变以确保类型安全,这意味着
List<Intreger>
不算 List<Number>
的子类型。让我们描述给定代码行
不要编译行:
List<Number> ints = new ArrayList<Integer>();
:我们不能将List<Integer>
分配给List<Number>
的变量类型,因为java中的泛型不是协变的。List<Integer> nums = new ArrayList<Number>();
:与第一个原因相同,我们不能将List<Number>
分配给List<Integer>
List<Object>nums = new ArrayList<Integer>();
:与第一个原因相同,我们不能将List<Integer>
分配给List<Object>
编译行:
List nums = new ArrayList(); :此行有效,因为在此行中您使用带有上限
? extends Number
的通配符。上限通配符允许您接受 T
类型的任何子类型。这意味着 ? extends Number
接受 Integer
、Double
、Float
等
List nums = new ArrayList(); :
List nums = new ArrayList(); :此行有效,因为在此行中您使用具有下限
? extends Number
的通配符。下限通配符允许您接受类型 T
的任何超类型。
这意味着 ? extends Number
接受 Number
和 Object
。