todd.run hoàn toàn đúng, nhưng đó chỉ là một nửa câu trả lời. Cũng có các trường hợp sử dụng để chọn <T>
trên <?>
(hoặc ngược lại) áp dụng khi bạn không thêm thông số loại vào lớp bao quanh phương thức. Ví dụ, hãy xem xét sự khác biệt giữa
public <E extends JLabel> boolean add(List<E> j) {
boolean t = true;
for (JLabel b : j) {
if (b instanceof JLabel) {
t = t && labels.add(b);
}
}
return t;
}
và
public boolean add(List<? extends JLabel> j) {
boolean t = true;
for (JLabel b : j) {
if (b instanceof JLabel) {
t = t && labels.add(b);
}
}
return t;
}
Phương pháp đầu tiên sẽ thực sự không biên dịch trừ khi bạn thêm một tham số kiểu phù hợp với lớp kèm theo, trong khi phương pháp thứ hai SẼ biên dịch cho dù lớp kèm theo có tham số kiểu. Nếu bạn không sử dụng <?>
, thì bạn phải chịu trách nhiệm trước khi nói cho trình biên dịch biết cách lấy loại sẽ được điền vào bằng chữ cái được sử dụng tại chỗ của nó. Bạn thường gặp phải vấn đề này - cần phải sử dụng? thay vì T - khi cố gắng viết các phương thức chung mà sử dụng hoặc cần "mở rộng" và "siêu". Cách xử lý tốt hơn nhưng phức tạp hơn về vấn đề này là ở trang 18 của Gilad Bracha's Generics Tutorial (PDF). Ngoài ra, hãy xem this stack overflow question câu trả lời của họ làm sáng tỏ những vấn đề này.
Kiểm tra liên kết tràn ngăn xếp này để biết thông tin về câu hỏi thứ hai của bạn: Java generics - type erasure - when and what happens. Mặc dù tôi không biết câu trả lời cho câu hỏi của bạn về sự khác biệt về thời gian biên dịch giữa <?>
và <T>
, tôi chắc chắn câu trả lời có thể được tìm thấy tại this FAQ mà erickson đã đề cập trong bài đăng đó.
Nguồn
2009-03-29 22:33:34
Bạn có thể chụp loại ký tự đại diện trong trường hợp này: boolean add (Danh sách Extends JLabel> list) {return addImpl (danh sách); } boolean addImpl (danh sách danh sách) {... –
(Mã ví dụ hơi lạ. Bạn có thể trả lại sau khi nhãn.add trả về false. –
Câu trả lời này không có ý nghĩa và không chính xác. Tôi đặt phương thức đầu tiên trong một lớp không có tham số kiểu ('public class test {List labels = new ArrayList (); // add method here}') và nó biên dịch tốt. –
user102008