2016-08-15 33 views
7

Tôi cố gắng để sử dụng phương pháp tham khảo với biểu ArrayType[]::new trong ví dụ sau:phương pháp tham khảo với nhà xây dựng mảng

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 

Nhưng những gì tôi nhận được trong phương pháp test1 chỉ là một mảng với các phần tử rỗng, không nên biểu thức ArrayType[]::new tạo một mảng với kích thước được chỉ định và gọi cấu trúc lớp A cho mỗi phần tử như những gì xảy ra khi sử dụng e xpression Type::new theo phương pháp test3?

Trả lời

11

ArrayType[]::new là tham chiếu phương thức cho một hàm tạo mảng. Khi bạn tạo một thể hiện của một mảng, các phần tử được khởi tạo thành giá trị mặc định cho kiểu của mảng và giá trị mặc định cho các kiểu tham chiếu là null.

Cũng như new ArrayType[3] tạo ra một mảng của 3 null tài liệu tham khảo, vì vậy không gọi s.apply(3) khi s là một tài liệu tham khảo phương pháp để một nhà xây dựng mảng (ví dụ: ArrayType[]::new) sẽ tạo ra một mảng của 3 null tài liệu tham khảo.

+0

Cảm ơn bạn đã giải thích chi tiết và rõ ràng. Nó rất hữu ích và dễ hiểu. –

+1

@NarutoBijuMode Bạn được chào đón! – Eran

+3

Là phụ lục, hoạt động mong muốn có thể đạt được thông qua 'test1 (3, i -> Stream.generate (A :: mới) .limit (i) .toArray (A [] :: new));' – Holger

Các vấn đề liên quan