不确定一个好方法来说明这个:如果我有一个通用的SuperClass<T>
和一个显式参数化超类的子类(即SubClass extends SuperClass<SubParameter>
,为什么不能使用子类来实例化一个使用子类使用的参数的超类参数化的超类的实例(即SuperClass<SuperParameter> = SubClass<SubParameter>
)。
因为那是一个子/超类的混乱,这是一个例子:
我有一个泛型类Block
,它由扩展类Shape
的类型参数化。然后我创建一个子类SquareBlock extends Block
,它明确指定其超类的类型参数。该类型参数是超类(Square extends Shape
)中预期类型参数的子类。
问题:为什么SquareBlock
的实例不能用于Block<Shape>
类型的变量,因为SquareBlock extends Block
和Square extends Shape
都是是真的吗?
// outer class
class Block <T extends Shape> {}
class SquareBlock extends Block<Square> {}
// inner class used in type of outer class
class Shape {}
class Square extends Shape {}
public class Generics {
public static void main(String[] args) {
// Square class can be used where Shape class is specified
Shape shape = new Square(); // works
List<Shape> list = new ArrayList<>();
list.add(new Square()); // works
Block<Shape> block = new SquareBlock();
// Type mismatch: cannot convert from SquareBlock to Block<Shape>
}
}