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

时间:2018-05-08 16:11:47

标签: java intellij-idea

假设我们有以下代码:

public interface Dvd {
   void startDvd();
}

和另一个界面:

public interface Tv {
    void startTv();
}

和一个班级:

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

    }

    @Override
    public void startTv() {

    }
}

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

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
    }
}
然而,显示的是:

an image of my intellij code complete

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

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

3 个答案:

答案 0 :(得分:4)

这是IntelliJ提供的一种帮助,如果您在选择enter后按startDvd(),它将替换((Logitech) tv).startDvd();中的代码

如果您删除此演员表,您将获得经典cannot resolve method 'startDvd()'

答案 1 :(得分:4)

这仅适用于局部变量,并且只有当IntelliJ能够确定变量的类型实际上总是某个具体类型时(在这种情况下为Logitech)。

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

的类
class Foo implements Tv {
    @Override
    public void startTv() { }
}

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

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
    }
}

然后IntelliJ不再能够推断出类型,因此它不会使用Logitech(或来自Foo)的方法提示我们。

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

答案 2 :(得分:0)

偷偷地说tv对象是Logitech类的一个实例。 Intellij试图通过让你知道你可以访问startDvd()方法,如果你想通过使用强制转换来帮助你。

很长一段时间告诉你,你可以将电视机重新投入罗技。

但是,如果当时所有程序需要的是TV对象,最好将TV设置为直接实现 Tv接口的类。

或者您可能希望匿名实现它:

    Tv tv = new Tv() {
        public void startTv() {
            //code to start the tv
        }
    }