假设我们有以下代码:
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()?
答案 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
}
}