7

I tried to use reference method with expression ArrayType[]::new in the following example:

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);
    }
}

Output

[null, null, null]
[0, 1, 2]
3

But what i get in method test1 is only an array with null elements, shouldn't the expression ArrayType[]::new create an array with the specified size and call the construction of class A for each element like what happen when using expression Type::new in method test3?

Stefan Zobel
  • 3,182
  • 7
  • 28
  • 38
Naruto Biju Mode
  • 2,011
  • 3
  • 15
  • 28

1 Answers1

14

ArrayType[]::new is a method reference to an array constructor. When you create an instance of an array, the elements are initialized to the default value for the array's type, and the default value for reference types is null.

Just as new ArrayType[3] produces an array of 3 null references, so does calling s.apply(3) when s is a method reference to an array constructor (i.e. ArrayType[]::new) would produce an array of 3 null references.

Eran
  • 387,369
  • 54
  • 702
  • 768