Description
Given the following scenario,
public class TInspectorCluster {
public interface Ancestor {
}
public interface Offspring extends Ancestor {
}
public interface Visitor<T>
public static class StringInspector implements Visitor<String> {
public String visit(Ancestor o)
public String visit(Offspring o)
{ System.out.println("Got the offspring method") return null; } }
}
define the test as:
public static void main(String[] args) throws Exception {
Ancestor ancestor = new Ancestor() {
};
new Statement(new StringInspector(), "visit", new Object[]
{ cat })
.execute();
}
then it throws
java.lang.NoSuchMethodException: Cannot decide which method to call to match visit
at java.beans.Statement.findMethod(Statement.java:376)
at java.beans.Statement.invokeMethod(Statement.java:218)
at java.beans.Statement.execute(Statement.java:18)
I think the problem is caused by the java.beans.Statement.findMethod().
If the target class has two candidate methods which have the identical signature (difference equals to zero) but different return type, it will throws this kind of exception.
Thus, I think the cure is to insert a routine check of their return types. If they have the same return type, then throw the NoSuchMethodException.
If not, check whether they are assignable to each other and reflect the specific one.