Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Eclipse-`open call hierarchy`得到了错误的结果_Java_Eclipse_Eclipse Jdt - Fatal编程技术网

Java Eclipse-`open call hierarchy`得到了错误的结果

Java Eclipse-`open call hierarchy`得到了错误的结果,java,eclipse,eclipse-jdt,Java,Eclipse,Eclipse Jdt,以下是我的示例java代码: public class Test { public static void foo() { Foo.InnerKey key = new Foo.InnerKey(); getInstance().query(key); } public static void bar() { Bar.InnerKey key = new Bar.InnerKey(); getInstanc

以下是我的示例java代码:

public class Test {
    public static void foo() {
        Foo.InnerKey key = new Foo.InnerKey();
        getInstance().query(key);
    }

    public static void bar() {
        Bar.InnerKey key = new Bar.InnerKey();
        getInstance().query(key);
    }

    public static MyIF getInstance(){
        // TODO code to get instance
        return null;
    }

}


interface MyIF {
    public void query(Foo.InnerKey key); // Method to open call hierarchy
    public void query(Bar.InnerKey key);
}


class Foo {
    static class InnerKey  {}
}

class Bar {
    static class InnerKey {}
}
当我从Eclipsekepler中打开方法queryFoo.InnerKey的调用层次结构时,我得到了两个foo和bar方法,而bar是不需要的

但在netbeans7.3.1中,调用层次结构的结果是正常的:


这是Eclipse的bug吗?谢谢。

我认为这可能是同一个问题,尽管你的例子更简单,但我建议你在错误报告中添加评论和例子


另外,可能与另一个的罪魁祸首有关,

这肯定是一个应该报告的JDT错误。当搜索方法引用时,bug与调用层次结构没有直接关系,而是与org.eclipse.jdt.core搜索API有关,其中参数是另一种类型的成员类型,例如Foo.InnerKey。因此,每个依赖于使用JDT搜索引擎查找方法引用的JDT功能都会出现此错误。例如,当显示对MyIFqueryFoo.InnerKey的引用或使用Java搜索搜索methodMyIFqueryFoo.InnerKey时,也会得到错误的结果。在这些情况下,搜索引擎不仅会像预期的那样返回对MyIFqueryFoo.InnerKey的引用,还会返回对MyIFqueryBar.InnerKey的引用

发生此错误的相关代码位于org.eclipse.jdt.internal.core.search.matching.MethodLocatorMatchMethodBinding中,布尔值。看起来,这个bug是通过修复引入的

下面是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);
            [...]
        }
    }
    [...]
}
当将鼠标悬停在测试类中的查询方法引用(例如getInstance.querykey)上时,会找到两个方法,其中一个方法可以选择一个,而不需要区分这两个方法

打开Javadoc视图并选择测试类中的任何查询方法引用时,Javadoc视图始终仅显示源类中第一个找到的方法的Javadoc,即MyIFqueryFoo.InnerKey


这似乎与上面描述的bug没有直接关系,而且当删除上面提到的if语句时,它也不会被解决…

Eclipse可能有bug?!可能骗了我…@KepaniHaole我已经测试了Eclipse3.5和4.3,同样的结果。以前没有人报告过这个bug?我主要是在讽刺-这完全可能是一个没有人注意到/报告过的现有bug,因为InnerKey是一个静态变量?@Balder我刚刚报告了它,但只是简单地链接到StackOverflow。我认为你是报告这个bug的最佳人选。我不熟悉eclipse核心开发。非常感谢。删除if argType.isMemberType语句后,调用层次结构和搜索结果都正常!但是我无法在我的eclipse 3.5中重现Bug 41018,可能是出了问题。@yf我只是看了一下,当if argType.isMemberType语句被删除时,Bug 41018真的被重新引入了。要复制它,请查看Knut的第二个简化片段,并打开methodA的引用。虽然该方法在同一类中被明确引用,但找不到任何引用。我建议将其报告为一个新的bug,并将其链接到bug 41018以及这个堆栈溢出问题,以便jdt开发人员可以查看它。顺便说一句:很好的发现,安迪!
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);
}