Ссылочный метод с конструктором массива
Я пытался использовать метод ссылки с выражением 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
создать массив с указанным размером и вызвать конструкцию класса A
для каждого элемента, как то, что происходит при использовании выражения Type::new
в методе test3
?
1 ответ
ArrayType[]::new
является ссылкой на метод конструктора массива. Когда вы создаете экземпляр массива, элементы инициализируются значением по умолчанию для типа массива, а значение по умолчанию для ссылочных типов равно нулю.
Как только new ArrayType[3]
производит массив из 3 null
ссылки, так же, как и звонки s.apply(3)
когда s
является ссылкой на метод конструктора массива (т.е. ArrayType[]::new
) будет производить массив из 3 null
Рекомендации.