Hãy xem xét các nhà xây dựng sau cho lớp Foo
(mà vì lợi ích của sự rõ ràng là không một lớp generic):Trường hợp sử dụng cho một nhà xây dựng chung là gì?
public <T> Foo(T obj) { }
Đây là cú pháp hợp lệ cho nhà thầu, giống như với bình thường generic methods.
Nhưng việc sử dụng cú pháp này là gì? Thông thường các phương thức chung cung cấp kiểu an toàn cho kiểu trả về của chúng và có thể được hưởng lợi từ kiểu suy luận của trình biên dịch. Ví dụ:
Pair<String, Integer> stringInt = Pair.of("asfd", 1234);
Nhưng cuộc gọi tới hàm tạo luôn trả về một thể hiện của loại khai báo. Các nhà xây dựng trên chỉ có thể được thay thế bằng erasure của nó:
public Foo(Object obj) { }
Trong Generics Tất nhiên là không chỉ về loại an toàn với nhiều loại trở lại. Các nhà xây dựng chỉ có thể muốn hạn chế các loại lập luận (s) được thông qua tại Tuy nhiên, các lý do trên vẫn được áp dụng cho một số loại bị chặn:.
public <N extends Number> Foo(N number) { }
public Foo(Number number) { } //same thing
tham số kiểu Ngay cả lồng nhau với giới hạn được xử lý sử dụng ký tự đại diện:
public <N extends Number, L extends List<N>> Foo(L numList) { }
public Foo(List<? extends Number> numList) { } //same thing
Vì vậy, trường hợp sử dụng hợp pháp để có một nhà xây dựng chung là gì?
Aha, rất thú vị! +1 –
+1, đây là một ví dụ tuyệt vời, mặc dù nó cheats một chút vì OP đặc biệt nói rằng loại kèm theo không phải là chung chung. ('Stream' sẽ là chung chung.) –
@JohnFeminella - Tôi chỉ có nghĩa là ví dụ cụ thể của tôi 'Foo' không phải là chung chung, chỉ để tránh nhầm lẫn. Tôi không có nghĩa đó là một hạn chế về câu trả lời. –