2013-05-30 101 views
0

我有扩展其他接口的接口。当使用这些接口的实现时,我的IDE(Eclipse和IntelliJ思想)无法解析实现类。这并不妨碍代码的编译,但IDE非常奇怪。我有什么根本的误解吗?我提出了一个概述问题的简化结构。Java接口继承导致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(); 
    } 
} 

现在,如果我定位到somewhatAvoidable.avoid();并要求IDE找到实现avoid()方法的代码,它会问我是否意思是MostlyAvoidableImpl或SomewhatAvoidableImpl。为什么?当然,它可以弄清楚这一点?

这是理念10.5按下Ctrl键+ Alt键+(诚然,相当旧的版本现在)时会发生什么,但它也发生在Eclipse的最新版本。

Idea 10.5 behaviour

编辑:在最后一行改正错字 - SimplyAvoidImpl到SomewhatAvoidableImpl,并添加屏幕截图。

+1

'SimplyAvoidImpl'在哪里? –

+0

@ Code-Guru难道你不认为这只是一个错字? – maba

+0

@maba最有可能。但很难推断出修正应该是什么。 –

回答

0

从你给的代码,somewhatAvoidable(在UsesSomewhatAvoidable类)被声明为SomewhatAvoidable这是一个接口,没有为avoid()方法的实现。编译器(以及IDE)无法知道您想要跳到哪个类来执行。

+0

但根据OP,IDE建议'MostlyAvoidableImpl',它不可能是正确的... –

+0

@OliCharlesworth好点。 OP还声称IDE提出了一个甚至在该示例中不存在的类。我故意避免在这个答案中的细节,因为我不确定在OP的结尾发生了什么*实际*。 –

+0

someAvoidable被声明为SomewhatAvoidable,它由SomewhatAvoidableImpl实现,它具有一个实现avoid()的方法。 –

1

当然,它可以弄清楚这一点?

是的,它应该能够找出avoid()方法使用SomewhatAvoidable给出的接口执行。如果它给出了一个完全不同的类(例如在这种情况下为MostlyAvoidableImpl),那么就我所知,这将是一个错误(无论如何,我看不到SomewhatAvoidable可能与MostlyAvoidableImpl有关。 )您可能会以某种方式混淆IDE - 尝试清理或重新启动,看看它是否有所作为。

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

+0

这是一个影响我们所有代码和所有开发人员的广泛问题。我将这个问题归结为我认为是一个有代表性的例子。 –

3

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

位置在UsesSomewhatAvoidableavoid方法插入符号,然后按Ctrl键 + Alt键 + Go To | Implementation(s)):

enter image description here

我在SomewhatAvoidableImpl执行结束:

enter image description here

+0

+1努力重新创建OP的例子 –

+0

感谢您煞费苦心。我想升级到Idea 12会有所帮助(因为它似乎解决了我描述的问题),但它主要影响Eclipse开发人员。 –

+0

@ChrisWelsh是的,它似乎工作。它可能是一个错误,或者它现在可能永远不会以它的工作方式实现。使用最新的IDE版本总是更可取。我自己不使用Eclipse(出于各种原因),所以我不能为使用它的人说话。所以你一定要升级到IntelliJ版本12。 – maba