IntelliJ 2018.1.3显示了接口中的所有方法,为什么?

Max*_*ood 2 java intellij-idea

假设我们有以下代码:

public interface Dvd {
   void startDvd();
}
Run Code Online (Sandbox Code Playgroud)

和另一个接口:

public interface Tv {
    void startTv();
}
Run Code Online (Sandbox Code Playgroud)

和一个类:

public class Logitech implements Dvd, Tv {
    @Override
    public void startDvd() {

    }

    @Override
    public void startTv() {

    }
}
Run Code Online (Sandbox Code Playgroud)

然后当你创建一个实例时:

public class Demo {
    public static void main(String[] args) {
        Tv tv = new Logitech();
        tv.  //here when we click the . we expect to see only the startTv() 
             //method, as the type of our reference is Tv
    }
}
Run Code Online (Sandbox Code Playgroud)

然而显示的是:

我的 Intellij 代码的完整图像

这不是使抽象 OOP 概念无效吗,因为它总是向我显示我的类实现的接口中的所有方法,有时这可能是大量的方法,不会为我隐藏任何复杂性?

为什么我看到这两种方法而不仅仅是 startTv()?

Mic*_*ael 5

这仅适用于局部变量,并且仅当 IntelliJ 能够确保变量的类型实际上始终是某种具体类型时(在本例中Logitech)。

如果我们添加另一个类来实现Tv

class Foo implements Tv {
    @Override
    public void startTv() { }
}
Run Code Online (Sandbox Code Playgroud)

然后有条件地分配给变量:

class Demo
{
    private static int bar()
    {
        return 3;
    }

    public static void main(Tv args) {
        Tv tv = new Logitech();

        if (bar() > 2)
        {
            tv = new Foo();
        }

        tv. //only has startTv method
    }
}
Run Code Online (Sandbox Code Playgroud)

那么 IntelliJ 不再能够推断类型,因此它不会提示我们来自Logitech(或来自Foo其中任何一个)的方法。

对于方法参数也是如此 - IntelliJ 不知道真正的具体类型,因此它不会为您提供任何其他方法。