2016-08-15 89 views
7

我試圖在下面的示例中使用的參考方法用表達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僅是一個陣列使用null元素時,不應該使用表達式ArrayType[]::new創建一個具有指定大小的數組,併爲每個元素調用類A的構造,就像使用e方法test3中的表達式Type::new

回答

11

ArrayType[]::new是一個引用數組構造函數的方法。在創建數組的實例時,元素將初始化爲數組類型的默認值,而引用類型的默認值爲null。

正如new ArrayType[3]產生的3個null引用數組,所以不調用s.apply(3)s是一種方法參照數組構造(即ArrayType[]::new)將產生的3所null引用的數組。

+0

謝謝您的詳細和明確的解釋。這是非常有幫助和可以理解的。 –

+1

@NarutoBijuMode不客氣! – Eran

+3

作爲附錄,可以通過'test1(3,i - > Stream.generate(A :: new).limit(i).toArray(A []​​ :: new));'' – Holger