IntelliJ 2018.1.3为何显示多接口实现类的所有接口方法?
为啥IntelliJ 2018.1.3会显示所有接口的方法?
嘿,这个问题我之前也碰到过,咱们先把代码摆出来看得更清楚:
// 定义接口Dvd public interface Dvd { void startDvd(); } // 定义接口Tv public interface Tv { void startTv(); } // 实现类Logitech public class Logitech implements Dvd, Tv { @Override public void startDvd() { } @Override public void startTv() { } } // Demo类 public class Demo { public static void main(String[] args) { Tv tv = new Logitech(); tv. // 这里点击.时,IntelliJ 2018.1.3显示了所有接口的方法 } }
这其实是IntelliJ IDEA的智能代码补全特性导致的,和Java本身的语法规则不冲突:
- 从Java编译层面来说,
Tv类型的引用确实只能调用Tv接口定义的方法,如果你硬要调用startDvd(),编译阶段肯定会报错。 - 但IntelliJ在做代码补全时,会做一个“实际类型推断”:因为你是直接把
new Logitech()赋值给Tv引用,IDE能100%确定这个引用指向的实际对象是Logitech实例。为了提升开发效率,它就会把这个实例所有可访问的方法都列出来——哪怕有些方法不属于Tv接口。 - 说白了,IDE只是提前给你展示了所有可能的方法选项,但语法规则依然生效,选错了还是会报错。
如果你希望严格按照引用类型来显示补全选项,也可以调整IntelliJ的设置:
- 打开
Settings(Windows/Linux点File->Settings,Mac点IntelliJ IDEA->Preferences) - 找到
Editor->General->Code Completion - 勾选
Show only items applicable to the current context(2018.1.3版本有这个选项,不同版本可能名称略有不同)
调整后,代码补全就只会显示Tv接口的startTv()方法了。
内容的提问来源于stack exchange,提问作者Max Yearwood
相关产品推荐
相关产品推荐

