我有一个通用方法,其工作方式与递归类似,但每次调用时都调用该方法的不同实例。

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

与往常一样,尽管反射有一定用途,但通常是混乱的标志。

09-10 03:31