gpt4 book ai didi

intellij-idea - 当我单击 Find Usage 时,Intellij 如何选择构造函数?

转载 作者:行者123 更新时间:2023-12-04 21:35:52 26 4
gpt4 key购买 nike

我有一个带有 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 (编译错误 - 无所谓):public MyClass(String name, Object val1, Object val2, Integer cat) - 仍然 202 找到用法
  • 添加具有 Object 类型的最后一个参数的新构造函数:public MyClass(String name, Object val1, Object val2, Object cat)现在第一个构造函数(带有 Integer )有 196 个用法,第二个有 6 个用法。

  • 这正是我想要的(我有 6 个最后一个元素非空的调用)但是这种行为的原因是什么? Intellij 是否进行了一些检查以及输入类型是否为 MyEnum它不能作为 Integer 传递类型,但 null 可以传递给两者,那么为什么在第一个构造函数的情况下会少 6 个结果?

    当我从 Object变至 String (现在我有 2 个带有 StringInteger 的构造函数)在我运行 find 用法时都给我 0。

    感谢您对这种行为的解释。

    最佳答案

    如果您同时拥有 myMethod(Integer a)myMethod(Object a) , 调用 myMethod(null)将调用 Integer 版本,因为它更具体。同样,如果您只有 myMethod(MyEnum a)myMethod(Object a) ,如果传递空参数,将调用 MyEnum 版本。 (参见 this answer 关于空重载,它引用了 section 15.12.2.5 of the Java Language Specification 。)它的行为实际上没有区别,基于它是 Integer 还是 MyEnum;两者都比 Object 更具体,因此选择了重载。

    当您要求 IntelliJ IDEA 查找某个方法的用法时,它会使用自己的代码索引及其有关 Java 如何处理重载解析的知识来查找调用该方法的所有情况。虽然这些规则可能有些复杂(查看 Java 语言规范中的所有细节也让我的眼睛受伤),并且可以想象,在某些用例中,IDEA 会出错并看到与 Java 编译器和运行时会,在这种情况下,它看起来是正确的。这是一种使用它并理解和测试重载解析如何工作的便捷方式。

    关于intellij-idea - 当我单击 Find Usage 时,Intellij 如何选择构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38460399/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com