泛型超类无法识别子类

时间:2019-12-04 10:56:13

标签: java generics

我试图只允许特定的类被interact方法使用。该代码不会编译,也无法将基础类识别为超类的一部分。

我使用以下结构:

  • 抽象类可交互

  • 抽象类建筑扩展了可交互性

  • 抽象类 ContainerBuilding 扩展了建筑物

  • 刀具扩展了ContainerBuidling

为什么下面的代码无法编译? Cutter.class无法识别为建筑类。

  public static void main ( String[] args ) {
        ActionTest.<Building>interact ( Cutter.class );
    }

    public static <T extends Interactable> void interact ( Class<T> interactableClass ) {
        // do something
    }

也不会编译:

   public static void main ( String[] args ) {
        ActionTest.interact ( Cutter.class );
    }

    public static void interact ( Class<Interactable> interactableClass ) {
        // do something
    }

1 个答案:

答案 0 :(得分:2)

在第一个示例中,将interactableClass的类型更改为Class<? extends T>

public static <T extends Interactable> void interact ( Class<? extends T> interactableClass )

这是因为Java中的泛型是不变的,这意味着如果将参数声明为Class<Building>,则在以<Building>interact(...)调用该方法时,将无法传递Class<T>以外的任何内容。