2012-07-03 26 views
8

Tôi có mã sau nhưng tôi bị nhầm lẫn với tất cả các generics.Điều gì là tĩnh <T> Danh sách <T> phương thứcName (Danh sách <? super T> đầu vào)

public static <T> List<T> backwards (List<? super T> input) { 
     List<T> output = new ArrayList<T>(); 
     return output; 
} 

Hiểu biết của tôi là tôi có phương thức công khai tên là backwards để tạo danh sách array. Câu hỏi của tôi là những gì thực sự tôi đang nói với trình biên dịch với phần sau ......

static <T> List<T> backwards (List<? super T> input) 
+2

'backwards' mất trong danh sách một số * Loại *, nơi mà * Loại * là một supertype của 'T' (ví dụ, đầu vào có thể là một' Danh sách '), và trả về một danh sách 'T'. – Mehrdad

+0

Cảm ơn Mehrdad đã giải thích điều này. – user1459497

+0

Có phải 'đầu vào' sẽ được sử dụng trong' ngược lại 'không? Tôi không thấy nó sẽ được sử dụng ở đâu. – Crazenezz

Trả lời

31

Bạn đang nói với trình biên dịch:

<T> 

"Tôi tuyên bố một kiểu bất kỳ T cho phương pháp này, có thể là bất cứ điều gì (không nguyên thủy) cho mỗi cuộc gọi của phương pháp. "

List<T> 

"Phương pháp này sẽ trả về một List yếu tố có chứa các loại T."

List<? super T> input 

"Phương pháp này sẽ mất một tham số gọi input, mà là một List chứa phần tử kiểu T, hoặc bất kỳ siêu loại T. Ví dụ, nếu TInteger, input có thể là một List<Integer>, List<Number> hoặc List<Object>. "

+0

Cảm ơn Paul. Lời giải thích của bạn rất rõ ràng và chi tiết. – user1459497

+5

Điều này không giải quyết những gì chữ ký phương thức 'public static Danh sách ' có nghĩa là so với 'public static List '. – 2rs2ts

+2

@agarrett 'public static List ' không khai báo một tham số kiểu, và vì vậy phải có trong phạm vi của một tham số kiểu generic 'T' trên lớp khai báo. Nhưng câu hỏi thậm chí không đề cập đến điều đó, vì vậy tôi không hiểu tại sao bạn lại đưa nó lên. –

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