Intellij idea 当我单击“查找用法”时,Intellij如何选择构造函数?

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,因此

我有一个构造函数,它有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
,因此我想创建另一个只接受3个参数并将最后一个参数设置为null的构造函数

我想到了一些想法,但最后我尝试了以下解决方案:

  • 将最后一个参数从
    MyEnum
    更改为
    Integer
    (编译错误-无关紧要):
    公共MyClass(字符串名称、对象val1、对象val2、整数cat)
    -仍然可以找到用法

  • 使用Object类型的最后一个参数添加新构造函数:
    public MyClass(字符串名称、对象val1、对象val2、对象cat)
    ,现在第一个构造函数(使用
    Integer
    )有196种用法,第二个构造函数有6种用法

  • 这正是我想要的(我得到了6个非空的最后一个元素的调用),但是这种行为的原因是什么?Intellij是否进行了一些检查,如果输入类型为
    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的结果的。