Ссылочный метод с конструктором массива

Я пытался использовать метод ссылки с выражением 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 Рекомендации.

Другие вопросы по тегам