给定这两个构造函数:
SomeClass(int... params)
{
// Do things
}
SomeClass(long... otherParams)
{
// Do other things
}
实例化对象foo会发生什么?
SomeClass foo = new SomeClass();
未定义的默认构造函数是否以某种方式被调用?还是那些名为空数组的构造函数之一?如果是这样,先例是什么?
我已经做了一些基本的测试,发现如果定义了一个没有参数的构造函数,那么它将被调用。否则,似乎被称为模棱两可的。
按照下面的“ Java方法重载中的变量”中的一个很好的答案,问题是Java编译器用于选择要调用的方法签名的规则。它们基于JLS 5.3。方法调用转换文档。
Object
但不可以Long
int
可以Object
通过变成Integer
)int
不能变成Long
)由于两个构造函数都是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] 删除。
我来说两句