Intellij idea 当我单击“查找用法”时,Intellij如何选择构造函数?
我有一个构造函数,它有4个参数:Intellij idea 当我单击“查找用法”时,Intellij如何选择构造函数?,intellij-idea,Intellij Idea,我有一个构造函数,它有4个参数:String、Object、Object、MyEnum public MyClass(String name, Object val1, Object val2, MyEnum cat) { // find in usage = 202 this.name = name; this.val1 = val1; this.val2 = val2; this.cat = cat; } 在95%的使用情况下,最后一个参数是null,因此
String、Object、Object、MyEnum
public MyClass(String name, Object val1, Object val2, MyEnum cat) {
// find in usage = 202
this.name = name;
this.val1 = val1;
this.val2 = val2;
this.cat = cat;
}
在95%的使用情况下,最后一个参数是null
,因此我想创建另一个只接受3个参数并将最后一个参数设置为null的构造函数
我想到了一些想法,但最后我尝试了以下解决方案:
MyEnum
更改为Integer
(编译错误-无关紧要):公共MyClass(字符串名称、对象val1、对象val2、整数cat)
-仍然可以找到用法public MyClass(字符串名称、对象val1、对象val2、对象cat)
,现在第一个构造函数(使用Integer
)有196种用法,第二个构造函数有6种用法MyEnum
,则不能将其作为Integer
类型传递,但可以将null传递给两者,那么为什么在第一个构造函数的情况下,结果会少6个
当我从Object
更改为String
(现在我有两个构造函数,分别是String
和Integer
)时,当我运行find usage时,它们都给我0
谢谢你对这种行为的解释 这不是一个真正的IntelliJ问题,而是一个java构造函数链接问题 如果cat很有可能为null,则应具有以下两个构造函数:
public MyClass(String name, Object val1, Object val2) {
this(name, val1, val2, null)
}
public MyClass(String name, Object val1, Object val2, MyEnum cat) {
this.name = name;
this.val1 = val1;
this.val2 = val2;
this.cat = cat;
}
如果您同时拥有
myMethod(Integer a)
和myMethod(Object a)
,则调用myMethod(null)
将调用整数版本,因为它更具体。类似地,如果您只有myMethod(MyEnum a)
和myMethod(Object a)
,那么如果传递了null参数,就会调用MyEnum版本。(请参阅关于空重载,其中引用了空重载。)基于它是Integer还是MyEnum,它的行为实际上没有什么区别;两者都比对象更具体,所以这就是要选择的重载
当您要求IntelliJ IDEA查找方法的用法时,它使用自己的代码索引和Java如何处理重载解析的知识来查找调用该方法的所有情况。虽然这些规则可能有点复杂(查看Java语言规范中的所有细节也会让我的眼睛受伤),但可以想象,在某些用例中IDEA可能会出错,并看到与Java编译器和运行时不同的东西,在这种情况下,它看起来是正确的。这是一种使用它、理解和测试重载解析如何工作的简便方法。您是在问Java的问题吗?或者你是在试图描述IDEA中的“Find usages”与Java的实际功能不匹配吗?我只想了解IDEA是如何在我发布的场景中选择Find Usage的结果的。