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

给定这两个构造函数:

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

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

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

SomeClass foo = new SomeClass();

未定义的默认构造函数是否以某种方式被调用?还是那些名为空数组的构造函数之一?如果是这样,先例是什么?

我已经做了一些基本的测试,发现如果定义了一个没有参数的构造函数,那么它将被调用。否则,似乎被称为模棱两可的。

卡罗尔·道贝克(Karol Dowbecki)

按照下面的“ Java方法重载中的变量”中的一个很好的答案,问题是Java编译器用于选择要调用的方法签名的规则。它们基于JLS 5.3。方法调用转换文档。

  1. 基本扩展使用可能的最小方法参数
  2. 包装器类型无法扩展为其他包装器类型
  3. 您可以将Box从int到Integer并扩展到,Object但不可以Long
  4. 加宽节拍,搏击节拍可变参数。
  5. 您可以先装箱,然后加宽(int可以Object通过变成Integer
  6. 您无法加宽,然后Box(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
}

JLS 4.10.1中解释了规则1中使用的基本类型之间的精确子类型关系基本类型之间的子类型化

以下规则定义了原始类型之间的直接超类型关系:

  • 双> 1浮点

  • 浮动> 1

  • long> 1个整数

  • 整数> 1个字符

  • int> 1

  • 短> 1个字节

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章