Tôi đang cố gắng hiểu các kiểu generic trong Java, và về lý thuyết có vẻ dễ hiểu, nhưng khi tôi cần áp dụng nó vào mã thực tôi có vấn đề. Tôi muốn khai báo phương thức trừu tượng sẽ trả về kiểu generic. Giả sử rằng tôi có một số giao diện rỗng gọi là Magicable và 2 class thực hiện nó: Magican và Witch. Bây giờ tôi tự hỏi sự khác biệt giữa những 3 tờ khai là gì:Sự khác biệt giữa việc sử dụng các ký tự đại diện và khai báo kiểu generic trong phương thức trừu tượng trong Java
/*1*/protected abstract <T extends Magicable> List<T> getMagicables();
/*2*/protected abstract List<? extends Magicable> getMagicables();
/*3*/protected abstract List<Magicable> getMagicables();
Trong trường hợp đầu tiên tôi có vấn đề khi tôi muốn thực hiện cơ thể của phương pháp này trong một số lớp mà mở rộng lớp trừu tượng:
@Override protected List<Magican> getMagicable() {..}
tôi có thông điệp cảnh báo:
loại an toàn: Các kiểu trả về Danh sách <Magican> cho getMagicable() từ loại MagicanService cần chuyển đổi không được kiểm tra để phù hợp với Danh sách <Magicable> từ loại MagicableService.
Trong trường hợp thứ hai tôi không có cảnh báo này, nhưng tôi có vấn đề trong lớp trừu tượng trong đó tôi tuyên bố trên phương pháp trừu tượng:
public void <T extends Magicable> T getOneFromList() { List<T> list = getMagicables(); //..... }
Trong trường hợp này tôi có lỗi biên dịch trong getMagicables () gọi:
Loại không khớp: không thể chuyển đổi từ Danh sách < chụp # 2-of? mở rộng Magicable > vào danh sách <T>
trường hợp thứ ba gây ra lỗi biên dịch ở cả hai nơi nêu trên mã. Tôi không nghĩ nếu nó là giải pháp đúng trong trường hợp của tôi.
'Danh sách phù thủy = getMagicables (Witch .class); 'là doable - với 1.' (Class loại) .... type.cast (obj) ... '. –
Rất khó có khả năng rằng # 1 là một dạng phương pháp mà mọi người sẽ sử dụng. Vì đối số kiểu cho 'T' được cho bởi mã gọi phương thức và vì chúng ta không thể tạo một thể hiện mới của' T', điều duy nhất mà phương thức có thể làm mà không có một số loại bỏ chọn được trả về một danh sách rỗng . Do đó, tại sao ví dụ: ['Collections.emptyList'] (http://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#emptyList--) và tương tự là những nơi duy nhất bạn sẽ tìm thấy phương pháp. – Radiodef