2009-09-22 33 views
10

Giả sử tôi có một lớp mà thực hiện một giao diện:danh sách các đối tượng java rằng tất cả thực hiện một giao diện

public class A implements IB 

và tôi có một List<A> mà tôi muốn tham khảo để: List<? implements IB> list. Để tôi có thể mã: for (IB item : list) v.v.

Có thể thực hiện bằng cách nào đó trong Java không? Không có khả năng <? implements ...>. Tôi đang thiếu gì?

+1

Bạn có nghĩa là IA? khi bạn nói IB? – OscarRyz

Trả lời

3

Nếu bạn có nghĩa là hạng A thực hiện IA, chứ không phải là IB, sau đó mã của bạn nên được tốt nói

for (A item : list) { 
    // handle item as if it is an IA 
} 

vì tất cả Như, theo định nghĩa IAs.

Trong khi đó, không có ký tự đại diện cho <? implements C>. Có <? extends C>C có thể là một giao diện hoặc một lớp học; tuy nhiên, điều này là không cần thiết cho những gì bạn có vẻ đang cố gắng làm.

Nếu bạn muốn nói rõ ràng for (IA item : list) vì bạn không đảm bảo rằng các mục trong danh sách đó là A s, nhưng đảm bảo rằng chúng là IA s, thì tôi nghĩ bạn có vấn đề nhỏ (tôi không thể nói chắc chắn, vì bạn không nói vị trí mã xử lý danh sách này nằm ở đâu). A List<A>không a List<IA> theo định nghĩa; nếu bạn đang xây dựng một List<A> và sau đó chuyển nó đến một phương thức mong đợi một List<IA>, bạn sẽ nhận được một lỗi thời gian biên dịch. Tuy nhiên, bạn có thể tạo một List<IA> và điền vào nó với A s. Lý do cho điều này được giải thích trong hướng dẫn của Java về Generics.

+0

Tôi đang nghĩ gì? Nó hoạt động hoàn hảo bởi vì trong C cũng có thể là một giao diện. Tôi nghĩ rằng 'mở rộng' thừa kế <=>. – Gerard

1

Vâng, bạn có thể khai báo số List<IA>.

Để xây dựng thêm về điều này, Danh sách có thể lưu trữ bất kỳ đối tượng nào triển khai IA trong đó. Việc nắm bắt được rằng, khi lấy chúng trở lại, bạn không biết lớp gốc mà không làm một số .getClass() trên đó.

Ví dụ:

List<IA> list = new ArrayList<IA>(); 
// code to populate list here 
for (IA item : list) { 
    item.iaMethod(); 
} 
18

Sử dụng extends:

public void someMethod(List<? extends IB> list) { 
    for (IB e : list) { 
    // Perform some processing on each element. 
    } 
} 

public void anotherMethod() { 
    List<A> list = new ArrayList<A>(); 
    someMethod(list); 
} 

Thông tin thêm có thể được tìm thấy tại The Java Tutorials trong đó có một comprehensive lesson on Generics.

Đặc biệt, section on wildcards giải thích làm thế nào để sử dụng ? với superextends để xác định một tham số là một trong đó là một lớp cha hoặc lớp con của một lớp nhất định.

+0

Tôi cũng đề xuất phiên từ Joshua Bloch từ JavaOne trong năm nay để biết thêm thông tin. Thực sự đã xóa nó cho tôi: http: // developers.sun.com/learning/javaoneonline/sessions/2009/pdf/TS-5217.pdf – amischiefr

+0

Cảm ơn câu trả lời. – Gerard

7

gì về:

List<? extends IA> list; 
2

Bạn có thể làm điều đó với extends:

List<? extends IA> list 
Các vấn đề liên quan