带数组构造函数的引用方法
Reference method with array constructor
我尝试在以下示例中使用表达式 ArrayType[]::new
的引用方法:
public class Main
{
public static void main(String[] args)
{
test1(3,A[]::new);
test2(x -> new A[] { new A(), new A(), new A() });
test3(A::new);
}
static void test1(int size, IntFunction<A[]> s)
{
System.out.println(Arrays.toString(s.apply(size)));
}
static void test2(IntFunction<A[]> s)
{
System.out.println(Arrays.toString(s.apply(3)));
}
static void test3(Supplier<A> s)
{
System.out.println(s.get());
}
}
class A
{
static int count = 0;
int value = 0;
A()
{
value = count++;
}
public String toString()
{
return Integer.toString(value);
}
}
输出
[null, null, null]
[0, 1, 2]
3
但是我在方法 test1
中得到的只是一个包含空元素的数组,表达式 ArrayType[]::new
不应该创建一个具有指定大小的数组并调用 [=26= 的构造] A
对于每个元素,例如在方法 test3
中使用表达式 Type::new
时发生的情况?
ArrayType[]::new
是对数组构造函数的方法引用。当您创建一个数组的实例时,元素被初始化为数组类型的默认值,而引用类型的默认值为 null。
正如 new ArrayType[3]
产生一个包含 3 个 null
引用的数组,当 s
是对数组构造函数的方法引用时调用 s.apply(3)
也是如此(即 ArrayType[]::new
) 会产生一个包含 3 个 null
引用的数组。
我尝试在以下示例中使用表达式 ArrayType[]::new
的引用方法:
public class Main
{
public static void main(String[] args)
{
test1(3,A[]::new);
test2(x -> new A[] { new A(), new A(), new A() });
test3(A::new);
}
static void test1(int size, IntFunction<A[]> s)
{
System.out.println(Arrays.toString(s.apply(size)));
}
static void test2(IntFunction<A[]> s)
{
System.out.println(Arrays.toString(s.apply(3)));
}
static void test3(Supplier<A> s)
{
System.out.println(s.get());
}
}
class A
{
static int count = 0;
int value = 0;
A()
{
value = count++;
}
public String toString()
{
return Integer.toString(value);
}
}
输出
[null, null, null]
[0, 1, 2]
3
但是我在方法 test1
中得到的只是一个包含空元素的数组,表达式 ArrayType[]::new
不应该创建一个具有指定大小的数组并调用 [=26= 的构造] A
对于每个元素,例如在方法 test3
中使用表达式 Type::new
时发生的情况?
ArrayType[]::new
是对数组构造函数的方法引用。当您创建一个数组的实例时,元素被初始化为数组类型的默认值,而引用类型的默认值为 null。
正如 new ArrayType[3]
产生一个包含 3 个 null
引用的数组,当 s
是对数组构造函数的方法引用时调用 s.apply(3)
也是如此(即 ArrayType[]::new
) 会产生一个包含 3 个 null
引用的数组。