2010-01-07 27 views
5

Ai đó có thể cho tôi biết lý do tại sao điều này mang lại lỗi biên dịch không? Tôi không thấy lý do tại sao các diễn viên để A trong thứ hai cho vòng lặp gây ra chuỗi() để trả về một danh sách chung của các đối tượng.Hành vi lạ với phương pháp tham số trên lớp trừu tượng

import java.util.ArrayList; 
import java.util.List; 

public class E { 

    public static void main(String[] args) { 
     for (String s : new D().strings()) { 
      System.out.println("s = " + s); 
     } 
     for (String s : ((A) new D()).strings()) { 
      System.out.println("s = " + s); 
     } 
    } 

    static class D extends A<C> { 
    } 

    static abstract class A<T extends B> { 
     List<String> strings() { 
      return new ArrayList<String>() {{ 
       add("Foo"); 
       add("Bar!"); 
      }}; 
     } 
    } 

    static class B { 
    } 

    static class C extends B { 
    } 
} 

Đây có phải là một quirk Generics không?

Cảm ơn, Kristian

Trả lời

7

Trong dòng:

for (String s : ((A) new D()).strings()) { 

Bạn đang đúc các loại nguyên A, vì vậy bạn sẽ mất những thông tin lý luận kiểu đó. Trong Java, bất kỳ phương thức hoặc trường sử dụng nào trên một kiểu thô cũng sẽ dẫn đến một kiểu thô (ngay cả khi tất cả các thông tin tham số có sẵn) - cũng kiểu thô hoặc không tham số kỹ thuật. Vì vậy, A.string() được xem là loại thô List thay vì List<String>.

Khi JSL quy định cụ thể trong Section 4.8:

Loại một constructor (§8.8), phương pháp dụ (§8.8, §9.4), hoặc không tĩnh lĩnh vực (§8.3) M của một nguyên loại C không được thừa hưởng từ các siêu lớp hoặc siêu kết nối của nó là xóa thuộc loại của nó trong khai báo chung tương ứng với C. Kiểu của một thành viên tĩnh của một kiểu thô C cũng giống như kiểu của nó trong khai báo chung tương ứng với C.

+3

Điều đó thực sự thú vị. Điều đó giải thích tại sao nếu bạn chuyển sang A thay vì chỉ A nó hoạt động. Trong trường hợp đó bạn vẫn đang sử dụng một lớp được đánh máy. – Shaun

+0

+1 Cảm ơn câu trả lời tuyệt vời này. Tôi đã xóa câu trả lời của riêng mình, điều đó không tốt bằng câu trả lời này. – KLE

+0

@Shaun, yup. Một phần, đó là vấn đề gây phiền nhiễu cho bạn để tránh sử dụng các loại thô! – notnoop

Các vấn đề liên quan