泛型 class 和通配符的上限
Upper Bound of generic class and wildcard
class Gen <T super Number> // 1 // IS NOT ALLOWED
void Demo( Gen <? super Number> ob) // 2 // IS ALLOWED // Gen is a generic class
为什么第一个语句导致编译时错误而第二个语句工作正常
第一个例子是泛型。第二个例子是参数化类型。它们是不同的东西。
- 泛型类型是对类型进行参数化的类型的定义。可以通过为这些类型参数提供类型参数来调用它。
- 参数化类型是使用类型参数调用泛型类型,无论这些类型参数是类型还是通配符。
泛型类型参数的下界没有任何用处†。它不是,因此 "a thing" in Java.
但是第二个例子的意思是:"any parameterisation of the type Gen<T>
, where the type argument is a supertype of Number"。它很有用,因为它允许泛型类型的多态性。
† 它们实际上可以通过提供 "restricted instantiation" 来限制使用,但被认为不够有用而被允许。
class Gen <T super Number> // 1 // IS NOT ALLOWED
void Demo( Gen <? super Number> ob) // 2 // IS ALLOWED // Gen is a generic class
为什么第一个语句导致编译时错误而第二个语句工作正常
第一个例子是泛型。第二个例子是参数化类型。它们是不同的东西。
- 泛型类型是对类型进行参数化的类型的定义。可以通过为这些类型参数提供类型参数来调用它。
- 参数化类型是使用类型参数调用泛型类型,无论这些类型参数是类型还是通配符。
泛型类型参数的下界没有任何用处†。它不是,因此 "a thing" in Java.
但是第二个例子的意思是:"any parameterisation of the type Gen<T>
, where the type argument is a supertype of Number"。它很有用,因为它允许泛型类型的多态性。
† 它们实际上可以通过提供 "restricted instantiation" 来限制使用,但被认为不够有用而被允许。