上个星期四,工作中的某个人向我展示了一个编译错误,我无法用一种干净的方式修复它,从那以后一直困扰着我。
这个问题是泛型相关的,我重建了一个生成编译错误的代码的简化版本。该错误发生在下面显示的最后一行代码中。
我一直在寻找所有的interwebs,但似乎无法找到一个体面的解释,为什么Java编译器不接受代码。我想,如果它允许代码,这将有可能在Bar.operationOnBar()中创建类转换问题,但我不知道如何。
有人可以请教我为什么这不编译?
public interface Interface {
}
public class Type implements Interface {
}
public class Bar {
public Bar(Class clazz) {
}
public void operationOnBar(Class arg){
}
}
public class Foo {
public Bar bar(Class clazz){
return new Bar(clazz);
}
public static void main(String[] args) {
Class extends Interface> extendsInterfaceClazz = Type.class;
new Foo().bar(extendsInterfaceClazz).operationOnBar(Type.class);
}
}在Foo.main()的第二行编译错误:
The method operationOnBar(Class) in the type Bar is not applicable for the arguments (Class)顺便说一句。我已经通过将Type.class向下转换为Class来解决它,这样编译器就无法看到泛型类是“Type”而不是“?extends Interface”。