gpt4 book ai didi

java - 具有可变参数的多个构造函数

转载 作者:行者123 更新时间:2023-11-30 01:56:56 25 4
gpt4 key购买 nike

给定这两个构造函数:

SomeClass(int... params)
{
// Do things
}

SomeClass(long... otherParams)
{
// Do other things
}

实例化对象 foo 时会发生什么?

SomeClass foo = new SomeClass();

是否以某种方式调用了未定义的默认构造函数?或者是否调用了具有空数组的构造函数之一?如果是这样,先例是什么?

我做了一些基本测试,发现如果定义了一个不带参数的构造函数,那么它将被调用。否则,看起来会调用一个不明确的调用。

最佳答案

根据 this very good answer in "Varargs in method overloading in Java" question以下是 Java 编译器用于选择要调用的方法签名的规则。它们基于JLS 5.3. Method Invocation Conversion文档。

  1. 原始扩展使用尽可能小的方法参数
  2. 包装类型不能扩展到其他包装类型
  3. 您可以从 int 装箱到 Integer,然后加宽到 Object,但不能扩展到 Long
  4. 加宽击败拳击,拳击击败 Var-args。
  5. 您可以先框起来,然后再加宽(int 可以通过Integer 变成Object)
  6. 您不能先加宽然后再方框(int 不能变为Long)
  7. 您不能将 var-args 与加宽或装箱结合使用

因为两个构造函数都是 var-args(规则 7),编译器将回退到其他规则并选择使用最小类型的方法(规则 1)。

您可以使用以下代码确认此行为:

static class SomeClass {
SomeClass(long... value) { System.out.println("Long"); }
SomeClass(int... value) { System.out.println("Int"); }
SomeClass(byte... value) { System.out.println("Byte"); }
}

public static void main(String[] args) throws Exception {
SomeClass o = new SomeClass(); // Byte
}

规则 1 中使用的基元类型之间的精确子类型关系在JLS 4.10.1. Subtyping among Primitive Types中进行了解释。 .

The following rules define the direct supertype relation among the primitive types:

  • double >1 float

  • float >1 long

  • long >1 int

  • int >1 char

  • int >1 short

  • short >1 byte

关于java - 具有可变参数的多个构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54117427/

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