Tôi đọc qua phần sau trong hướng dẫn Java: http://docs.oracle.com/javase/tutorial/java/generics/capture.htmlJava Generics Wildcard vs sử dụng Typed Generics
Nó bắt đầu bằng cách nói rằng đoạn mã sau tạo ra một lỗi do thực tế rằng một chụp không thể được chuyển đổi sang một đối tượng để các phương pháp set
không thể xác nhận đối tượng đó là kiểu chụp # 1:
import java.util.List;
public class WildcardError {
void foo(List<?> i) {
i.set(0, i.get(0));
}
}
tôi hơi hiểu lý do đằng sau này. i.get trả về một đối tượng, và trình biên dịch không thể xác định nếu đối tượng là loại hình # 1 vì vậy nó không thể phù hợp với đối số thứ 2 một cách an toàn.
Nó sau đó đề nghị sử dụng đoạn mã sau để thực hiện phương pháp làm việc này:
public class WildcardFixed {
void foo(List<?> i) {
fooHelper(i);
}
// Helper method created so that the wildcard can be captured
// through type inference.
private <T> void fooHelper(List<T> l) {
l.set(0, l.get(0));
}
}
tôi hơi hiểu tại sao mã này làm việc là tốt, trong mã này, l.get
là đảm bảo được các loại T, vì vậy nó có thể được thông qua như là một đối số kiểu T.
Những gì tôi không hiểu là tại sao bạn không thể chỉ cần sử dụng một phương pháp như thế này, không có người giúp đỡ:
class GenericsTest {
static <K> void bar(List<K> l) {
l.set(0, l.get(l.size() - 1));
}
public static void main(String[] args) {
List<Integer> lst = Arrays.asList(1, 2, 3, 4);
bar(lst);
System.out.println(lst); // [4, 3, 2, 4]
}
}
tức là nếu bạn định sử dụng suy luận kiểu, tại sao không chỉ sử dụng Generics gõ rõ ràng trên ký tự đại diện và chức năng trợ giúp? Có lợi thế nào khi sử dụng ký tự đại diện trong trường hợp này không? Trong trường hợp nào bạn thực sự muốn sử dụng một ký tự đại diện trên một loại chung chung?
'static void' có nghĩa là gì, theo bạn? –
@Mike Với tôi, nó có nghĩa là K là một tham số kiểu chỉ áp dụng cho phạm vi của phương thức. Java sử dụng suy luận kiểu để tìm ra những gì K được cho là đang chạy. Trong ví dụ được hiển thị, tôi chuyển vào một thể hiện của Danh sách để trình biên dịch đưa K trở thành Số nguyên. K có thể là bất kỳ loại tham chiếu nào và các loại tham chiếu mở rộng từ Object, vì vậy tôi xem K là một cách khác để viết > một cách rõ ràng trong trường hợp này. –
Shashank
@ Giống như tôi không biết ... nó có vẻ giống như một phương pháp void thông thường. Tôi không biết K có liên quan gì với sự trở lại. Tôi chỉ sử dụng cú pháp từ đây: http://docs.oracle.com/javase/tutorial/java/generics/methods.html – Shashank