泛型 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" 来限制使用,但被认为不够有用而被允许。