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?
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With