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时出现编译错误。
答案 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;代码因为我不确定你要做什么。