这绝对是一个应该报告的JDT错误。该错误与调用层次结构没有直接关系,而是与org.eclipse.jdt.core搜索API直接相关,当搜索方法引用时,其中参数是另一种类型的成员类型(例如)。因此,每个 JDT 功能都表现出此错误,该功能依赖于使用 JDT 搜索引擎查找方法引用。例如,在显示对 Java 搜索的引用或使用 Java 搜索来搜索方法时,您也会得到错误的结果。在这些情况下,搜索引擎不仅会像预期的那样返回对 的引用,还会返回对 的引用。Foo.InnerKey
MyIF#query(Foo.InnerKey)
MyIF#query(Foo.InnerKey)
MyIF#query(Foo.InnerKey)
MyIF#query(Bar.InnerKey)
发生此 bug 的相关代码位于 中。看起来,该错误是通过修复JDT Bug 41018引入的。org.eclipse.jdt.internal.core.search.matching.MethodLocator#matchMethod(MethodBinding, boolean)
下面是类 MethodLocator 中相关代码的一个片段:
protected int matchMethod(MethodBinding method, boolean skipImpossibleArg) {
[...]
// verify each parameter
for (int i = 0; i < parameterCount; i++) {
TypeBinding argType = method.parameters[i];
int newLevel = IMPOSSIBLE_MATCH;
if (argType.isMemberType()) {
// only compare source name for member type (bug 41018)
newLevel = CharOperation.match(this.pattern.parameterSimpleNames[i], argType.sourceName(), this.isCaseSensitive)
? ACCURATE_MATCH
: IMPOSSIBLE_MATCH;
} else {
// TODO (frederic) use this call to refine accuracy on parameter types
// newLevel = resolveLevelForType(this.pattern.parameterSimpleNames[i], this.pattern.parameterQualifications[i], this.pattern.parametersTypeArguments[i], 0, argType);
newLevel = resolveLevelForType(this.pattern.parameterSimpleNames[i], this.pattern.parameterQualifications[i], argType);
[...]
}
}
[...]
}
这里的问题是语句,该语句是为修复 Bug 41018 而引入的。注释还指出,对于成员类型,仅比较源名称。如果删除此 if 语句,则 bug 会消失,并且调用层次结构会显示正确的引用(但我想这当然会重新引入 bug 41018 - 我没有对此进行测试)。if (argType.isMemberType())
编辑
顺便说一句,在显示 Javadoc 的源代码时似乎也存在一个错误 - 无论是在使用 Javadoc-Hover 在方法上还是在 Javadoc 视图中显示方法时。MyIF#query(Bar.InnerKey)
public interface MyIF {
/**
* Javadoc for: query(Foo.InnerKey key)
*/
public void query(Foo.InnerKey key); // Method to open call hierarchy
/**
* Javadoc for: query(Bar.InnerKey key)
*/
public void query(Bar.InnerKey key);
}
当将鼠标悬停在 Test 类中的查询方法引用上时(例如),可以找到两个方法,并且一个方法可以选择一个(无法区分两者)。getInstance().query(key)
打开 Javadoc 视图并选择 Test 类中的任何查询方法引用时,Javadoc 视图始终仅显示源类中第一个找到的方法的 Javadoc(即 )。MyIF#query(Foo.InnerKey)
这似乎与上述错误没有直接关系,并且在删除上面提到的if语句时也不会得到解决...