【问题标题】:Java Compile error when return Generic Class type返回泛型类类型时的Java编译错误
【发布时间】:2016-05-06 21:52:26
【问题描述】:
public interface Parent{
}

public class Child implements Parent{
}

public <T extends Parent> Class<T> getClass(){
  return Child.class;  // compile error, add cast to Class<T>
}

我希望上面的代码没有错误,但是当我返回 Child.class 时出现编译错误。

【问题讨论】:

  • 公开课 getClass(){返回Child.class; } 工作。但不明白为什么第一个版本不起作用。
  • 如果你总是要返回Child.class,你应该使用Class&lt;Child&gt;...只在有意义的地方使用泛型...

标签: java class generics interface


【解决方案1】:

你不能告诉 Java 总是返回 Child.class 而不管 T。可能还有其他从父类扩展的类不是Child。此外,由于您没有在任何地方使用T,因此您的代码没有多大意义。两种可能的解决方案:

public Class<? extends Parent> getAClass() {
    return Child.class;
}

或许

public <T extends Parent> Class<T> getAClass(Class<T> clazz){
    return clazz; 
}

第二个示例可以编译,但如果在类级别声明 T 可能会更有意义。

另外,我重命名了您的方法以避免与现有的 getClass() 方法发生名称冲突。

【讨论】:

    【解决方案2】:

    查看以下内容

    public class Main {
        public interface Parent{}
        public class Child implements Parent{}        
        public class BadChild implements Parent {}
    
        public static <T extends Parent> Class<T> getClazz() {
            return Child.class;  // compile error, add cast to Class<T>
        }
    
        public static void main(String[] args) {
            Class<BadChild> clazz = Main.<BadChild>getClazz();
        }
    }
    

    BadChild 类型的调用方法getClazz() 对调用方有效。如果您可以编译会导致运行时错误的方法。这就是为什么这是被禁止的。

    【讨论】:

      【解决方案3】:

      如果这段代码是合法的,就可以这样写:

      Class<SomeOtherChildClass> clazz = instance.getAClass();
      

      (假设 SomeOtherChildClass 还扩展了 Parent)对于现有实现,这显然会在运行时失败。

      我不提供“更正”的代码,因为我不确定您要做什么。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多