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.
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 và > 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