2008-10-21 34 views
5

Lấy Generics Ví dụ sauLàm thế nào để bạn đối phó với "siêu" generics trong java?

import java.util.List; 
import java.util.ArrayList; 

public class GenericsTest { 
    private List<Animal> myList; 

    public static void main(String args[]) { 
     new GenericsTest(new ArrayList<Animal>()).add(new Dog()); 
    } 

    public GenericsTest(List<Animal> list) { 
     myList = list; 
    } 

    public void add(Animal a) { 
     myList.add(a); 
    } 

    public interface Animal {} 
    public static class Dog implements Animal {} 
    public static class Cat implements Animal {} 
} 

Nó hoạt động tốt. Nhưng như bạn đã biết, bạn không thể xây dựng nó với

new GenericsTest(new ArrayList<Dog>()); 

vì, bạn biết đấy, thêm (Động vật) sẽ có thể thêm Cat s. Các gợi ý cách giải quyết vấn đề này, ví dụ: wildcarding không hoạt động, hoặc, bởi vì, vâng, bạn có thể thay đổi mỗi List<Animal> trong List<? extends Animal> nhưng nó có cùng một vấn đề: bạn có thể tạo các GenericsTest với List<Cat> và sau đó thêm Dog s.

Vì vậy, câu hỏi của tôi là: có cách thuận tiện để viết lớp này một lần, và sau đó sử dụng nó cho tất cả các Animals có thể? Tất nhiên nó nên giải quyết đơn giản vấn đề được đề cập ở trên.

Trả lời

6

Nếu tôi hiểu những gì bạn đang cố gắng làm thì bạn cần phải đặt kiểu chung chung ở cấp lớp:

public class GenericsTest<T extends Animal> 
{ 
    private List<T> myList; 

    public static void main(String args[]) 
    { 
    new GenericsTest<Dog>(new ArrayList<Dog>()); 
    } 

    public GenericsTest(List<T> list) 
    { 
    myList = list; 
    } 

    public void add(T a) 
    { 
    myList.add(a); 
    } 
} 
+0

Phải. Mã thực sự của tôi phức tạp hơn, bởi vì Động vật của tôi thực sự là Danh sách > dường như không hoạt động, nhưng đó sẽ là câu hỏi tiếp theo của tôi (nếu tôi không tự tìm ra) – Davide

2

Bạn có thể muốn làm cho lớp toàn chung chứ không phải chỉ có các thông số:

import java.util.List; 
import java.util.ArrayList; 

public class GenericsTest<T extends Animal> { 
    private final List<T> myList; 

    public static void main(final String args[]) { 
     new GenericsTest<Animal>(new ArrayList<Animal>()).add(new Dog()); 
     new GenericsTest<Dog>(new ArrayList<Dog>()).add(new Dog()); 
     new GenericsTest<Cat>(new ArrayList<Cat>()).add(new Cat()); 
    } 

    public GenericsTest(final List<T> list) { 
     myList = list; 
    } 

    public void add(final T a) { 
     myList.add(a); 
    } 
} 

// Can't nest as Animal needs to be in scope of class declaration 
interface Animal {} 
class Dog implements Animal {} 
class Cat implements Animal {} 
Các vấn đề liên quan