我有一个通用方法,其工作方式与递归类似,但每次调用时都调用该方法的不同实例。
public <M extends A> void doSomething(Class<M> mClass, M mObject)
{
// ... Do something with mObject.
A object = getObject();
Class<? extends A> objectClass = object.getClass();
doSomething(objectClass, objectClass.cast(object)); // Does not compile.
}
private A getObject() {...}
问题是带有注释的行无法编译,并出现以下错误:
MainTest类型的方法doSomething(Class,M)不适用于自变量(Class,capture#3-of扩展A)
我不太明白为什么编译器可以通过M =“?extends A”来调用
doSomething
而不编译。为什么不编译?
最佳答案
该语言不会跟踪这样的通配符(看来)。您需要做的是捕获通配符,这可以通过类型推断的方法调用来完成。
public <M extends A> void doSomething(Class<M> mClass, M mObject) {
// ... Do something with mObject.
A object = getObject();
Class<? extends A> objectClass = object.getClass();
privateSomething(objectClass, object);
}
private <T extends A> void privateSomething(Class<T> objectClass, A object) {
doSomething(objectClass, objectClass.cast(object)); // Should compile.
}
与往常一样,尽管反射有一定用途,但通常是混乱的标志。