返回泛型类类型时发生Java编译错误 公共接口父级{ } 公共类子级实现父级{ } 公共类getClass(){ return Child.class;//编译错误,将强制转换添加到类 }

返回泛型类类型时发生Java编译错误 公共接口父级{ } 公共类子级实现父级{ } 公共类getClass(){ return Child.class;//编译错误,将强制转换添加到类 },java,class,generics,interface,Java,Class,Generics,Interface,我希望上面的代码没有错误,但是当我返回Child.class时,我得到了编译错误。你不能告诉Java总是返回Child.class,不管t。从父类扩展的其他类可能不是子类。另外,由于您没有在任何地方使用T,因此您的代码没有多大意义。两种可能的解决办法: public interface Parent{ } public class Child implements Parent{ } public <T extends Parent> Class<T> getClas

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

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

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>
}

public Class如果此代码是合法的,则可以编写:

public <T extends Parent> Class<T> getAClass(Class<T> clazz){
    return clazz; 
}
Class clazz=instance.getAClass();
(假设
SomeOtherChildClass
也扩展了
Parent
),对于现有实现,这显然会在运行时失败

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

查看以下内容

Class<SomeOtherChildClass> clazz = instance.getAClass();
公共类主{
公共接口父{}
公共类子级实现父级{}
公共类BadChild实现父{}
公共静态类getClazz(){
return Child.class;//编译错误,将强制转换添加到类
}
公共静态void main(字符串[]args){
Class clazz=Main.getClazz();
}
}

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

公共类如果您总是要返回
Child.Class
,您应该使用
Class
。。。仅在有意义的地方使用泛型。。。
Class<SomeOtherChildClass> clazz = instance.getAClass();
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();
    }
}