返回Generic Class类型时出现Java Compile错误

时间:2016-01-29 08:21:05

标签: java class generics interface

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时出现编译错误。

3 个答案:

答案 0 :(得分:5)

无论Child.class如何,您都无法告诉Java始终返回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()方法发生名称冲突。

答案 1 :(得分: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();
    }
}

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

答案 2 :(得分:1)

如果此代码合法,则可以写:

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

(假设SomeOtherChildClass也扩展Parent),这在现有实现的运行时会明显失败。

我不提供&#34;更正&#34;代码因为我不确定你要做什么。