由一种类型参数化的超类不能由指定子类型的子类实例化

时间:2017-09-27 18:41:51

标签: java generics

不确定一个好方法来说明这个:如果我有一个通用的SuperClass<T>和一个显式参数化超类的子类(即SubClass extends SuperClass<SubParameter>,为什么不能使用子类来实例化一个使用子类使用的参数的超类参数化的超类的实例(即SuperClass<SuperParameter> = SubClass<SubParameter>)。


实施例

因为那是一个子/超类的混乱,这是一个例子:

我有一个泛型类Block,它由扩展类Shape的类型参数化。然后我创建一个子类SquareBlock extends Block,它明确指定其超类的类型参数。该类型参数是超类(Square extends Shape)中预期类型参数的子类。

问题:为什么SquareBlock的实例不能用于Block<Shape>类型的变量,因为SquareBlock extends BlockSquare 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>
    }
}

0 个答案:

没有答案