2013-06-30 44 views
8

Tôi có một lớp chung Foo<T> và các loại được tham số Foo<String>Foo<Integer>. Bây giờ tôi muốn đặt các loại tham số khác nhau vào một đơn ArrayList. Cách làm đúng là gì?Vùng chứa các loại chung trong java

Candidate 1:

public class MMM { 
    public static void main(String[] args) { 
     Foo<String> fooString = new Foo<String>(); 
     Foo<Integer> fooInteger = new Foo<Integer>(); 

     ArrayList<Foo<?> > list = new ArrayList<Foo<?> >(); 
     list.add(fooString); 
     list.add(fooInteger); 

     for (Foo<?> foo : list) { 
      // Do something on foo. 
     } 
    } 
} 
class Foo<T> {} 

Candidate 2:

public class MMM { 
    public static void main(String[] args) { 
     Foo<String> fooString = new Foo<String>(); 
     Foo<Integer> fooInteger = new Foo<Integer>(); 

     ArrayList<Foo> list = new ArrayList<Foo>(); 
     list.add(fooString); 
     list.add(fooInteger); 

     for (Foo foo : list) { 
      // Do something on foo. 
     } 
    } 
} 
class Foo<T> {} 

Trong một từ, nó có liên quan đến sự khác biệt giữa Foo<?> và loại thô Foo.

Cập nhật:

Grep sự khác biệt giữa các ký tự đại diện kiểu tham số không giới hạn và các loại nguyên liệu là gì? trên this link có thể hữu ích.

Trả lời

8

List đại diện cho danh sách không có tham số loại. Đó là danh sách có các thành phần thuộc bất kỳ loại nào, ví dụ: các phần tử có thể có các loại khác nhau. Về cơ bản, nó giống như List<Object>.

Trong khi đó, List<?> đại diện cho danh sách có thông số loại không bị chặn. Các phần tử của nó là một kiểu cụ thể, nhưng không rõ (trước khi chạy), gõ. Tất cả các yếu tố này phải từ cùng một kiểu tại thời gian chạy.

Tôi khuyên bạn nên tránh sử dụng các loại thô. Giải pháp thích hợp cho ví dụ của bạn là List<Foo<?>>.

4

Bạn muốn tránh các loại thô bất cứ khi nào có thể. Cách chính xác để thực hiện điều đó là với
List<Foo<?>>.

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