2012-09-19 30 views

Trả lời

3

Generics rất phức tạp.

Trong trường hợp này Arrays.asList sẽ trả về một List<Class<MyOwnException>>, đó là không giống nhau hơn List<Class<? extends Throwable>>.

Hành vi của chúng sẽ khác nhau vì loại List<Class<? extends Throwable>> sẽ cho phép bạn thêm đối tượng mở rộng Có thể ném nhưng List<Class<MyOwnException>> chỉ chấp nhận các đối tượng thuộc loại MyOwnException.

+1

Đó là không đúng sự thật họ phải "giống hệt nhau": 'Danh sách x = new ArrayList ();' biên dịch, cũng như 'Danh sách x = new ArrayList (); ' – Bohemian

+0

Bạn nói đúng, Bohemian, tôi vừa sửa phần thứ hai, điều đó không đúng. Giờ xấu để trả lời nhanh. Cảm ơn! – enTropy

0

Nếu ví dụ thứ hai là để làm việc, nó sẽ cho phép mã như thế này:

Collection<Class<? extends Throwable>> exs = Arrays.asList(MyOwnException.class); 
exs.add(IOException.class); 

Xem vấn đề? Arrays.asList() sẽ trả lại một List<Class<MyOwnException>> và sau đó bạn sẽ cố gắng chèn Class<IOException> vào đó. Đó rõ ràng là một loại không phù hợp.

1

Dòng đầu tiên làm việc vì loại các yếu tố của bên phải của assignement (của ArrayList) là Class<? extends Throwable> cho phép thêm bất kỳ loại Class<? extends Throwable> đối tượng, bao gồm MyOwnException của bạn. Bạn cũng có thể thêm vào dòng đầu tiên Collection một Exception.class hoặc một NullPointerException.class vv

Nhưng dòng thứ hai là nghiêm ngặt hơn nhiều: bạn có một Collection<Class<? extends Throwable>> có thể chứa một Class<Exception>, một Class<NullPointerException>, vv và bạn muốn đưa vào đặt một Collection<Class<MyOwnException>> mà không cho phép Class<Exception> vv

6

lý do nó là một lỗi là java được suy luận kiểu sai, nhưng bạn có thể làm cho nó biên dịch, mà không đúc, bằng cách xác định loại trong cuộc gọi vào phương thức đã nhập Arrays.asList():

Collection<Class<? extends Throwable>> exs 
    = Arrays.<Class<? extends Throwable>>asList(Exception.class); // compiles 

Nếu không có quy định cụ thể các loại, java suy luận các loại nguyên tố của bộ sưu tập là Class<Exception>, đó là không thể chuyển nhượng để Collection<Class<? extends Throwable>>.

Ghi với Generics rằng nếu B kéo dài A, List<B> không không mở rộng List<A>.

+0

+1, nhưng tôi có một câu hỏi. Tại sao một biến cục bộ không được định nghĩa là 'Lớp clazz' làm thủ thuật trong 'Arrays.asList (clazz)'? – Raffaele

+1

@Raffaele Vì kiểu được suy ra từ tham số của 'asList' là' Lớp ', nhưng bạn cần nó khác biệt – Bohemian

+0

Thực ra trình biên dịch Eclipse nói 'Danh sách > vào List > ', nó không đề cập đến 'Class ', nhưng tôi không thể giải thích phần * capture # 1 * ... – Raffaele

1

Arrays.asList(MyOwnException.class) được phỏng đoán có loại List<Class<MyOwnException>>, không tương thích với List<Class<? extends Throwable>> vì các thông số loại khác nhau.

Nếu bạn đặt một ký tự đại diện ở cấp đầu tiên, cần làm việc:

Collection<? extends Class<? extends Throwable>> exs = Arrays.asList(MyOwnException.class); 
Các vấn đề liên quan