0

我有扩展其他接口的接口。当使用这些接口的实现时,我的 IDE(Eclipse 和 IntelliJ 想法)无法解析实现类。这并不能阻止代码编译,但 IDE 如此不确定是非常奇特的。我有什么基本的误解吗?我提出了一个概述问题的简化结构。

基础接口

public interface Avoidable {

    public void avoid();

}

扩展基础接口的接口

public interface MostlyAvoidable extends Avoidable {

    public void most();

}

是执行

public class MostlyAvoidableImpl implements MostlyAvoidable {
    @Override
    public void most() {}

    @Override
    public void avoid() {}
}

第二个扩展接口

public interface SomewhatAvoidable extends Avoidable {

    public void somewhat();

}

及其实现

public class SomewhatAvoidableImpl implements SomewhatAvoidable {

    @Override
    public void avoid() {}

    @Override
    public void somewhat() {}

}

最后是一个使用这些实现之一的类:

public class UsesSomewhatAvoidable {

    private SomewhatAvoidable somewhatAvoidable;

    public UsesSomewhatAvoidable(SomewhatAvoidable somewhatAvoidable) {
        this.somewhatAvoidable = somewhatAvoidable;
    }

    public void someMethod() {
        somewhatAvoidable.avoid();
    }
}

现在,如果我导航到 someAvoidable.avoid(); 行并要求 IDE 找到实现避免()方法的代码,它问我是指 MostlyAvoidableImpl 还是 SomewhatAvoidableImpl。为什么?它肯定能解决这个问题吗?

这就是在 Idea 10.5 中按下Ctrl++时发生的情况(诚然,现在是相当旧的版本AltB,但它也发生在最新版本的 Eclipse 中。

理念 10.5 行为

编辑:更正最后一行中的错字-将 SimplyAvoidImpl 改为 SomewhatAvoidableImpl,并添加了屏幕截图。

4

3 回答 3

3

我把你所有的接口和类都设置在我自己的 IntelliJ 中,我没有你描述的问题。

将插入符号放在avoid方法中UsesSomewhatAvoidable,然后按Ctrl+ Alt+ B( Go To | Implementation(s)):

在此处输入图像描述

我最终在以下实施SomewhatAvoidableImpl

在此处输入图像描述

于 2013-05-30T13:46:40.703 回答
1

它肯定能解决这个问题吗?

是的,它应该能够弄清楚该avoid()方法是使用SomewhatAvoidable. 如果它提供了一个完全不同的类(例如MostlyAvoidableImpl在这种情况下),那么据我所知,这将是一个错误(无论如何,对于您给出的示例,我看不出与 . 有什么SomewhatAvoidable关系MostlyAvoidableImpl。)这是可能的您以某种方式混淆了 IDE - 尝试清理或重新启动,看看它是否有所作为。

但是,它可能有效地为您提供更具体地选择实现的选项,因为这不能通过静态分析来确定(但显然必须选择一个这样的实现才能使程序在运行时正常工作。)

于 2013-05-30T13:43:31.237 回答
0

从您给出的代码中,somewhatAvoidable(在UsesSomewhatAvoidable类中)被声明为 aSomewhatAvoidable这是一个接口并且没有该avoid()方法的实现。编译器(以及 IDE)无法知道您要跳转到哪个类以进行实现。

于 2013-05-30T13:41:40.347 回答