【问题标题】:Subclass is not recognized from generic super class [duplicate]通用超类无法识别子类[重复]
【发布时间】:2025-12-11 02:40:01
【问题描述】:

我试图只允许交互方法使用特定的类。该代码无法编译并且无法将底层类识别为超类的一部分。

我使用以下结构:

  • 抽象类可交互

  • 抽象类Building扩展了Interactable

  • 抽象类 ContainerBuilding 扩展 Building

  • Cutter 类扩展 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
    }

【问题讨论】:

  • 您需要更改方法的签名以接受Class&lt;? extends Interactable&gt;。可以改一下interact的签名吗?
  • 是的,行得通。 T 和 ?.. 有什么区别?

标签: java generics


【解决方案1】:

在您的第一个示例中,将interactableClass 的类型更改为Class&lt;? extends T&gt;

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

这是因为 Java 中的泛型是不变的,这意味着如果参数声明为 Class&lt;T&gt;,则当您将该方法调用为 &lt;Building&gt;interact(...) 时,您不能传递除 Class&lt;Building&gt; 以外的任何内容。

【讨论】: