2012-06-28 38 views
6

Tôi có một số rắc rối với phương thức có tham số Danh sách đã nhập, được kế thừa từ lớp khác (đã nhập).Phương pháp với danh sách đã nhập và thừa kế

Hãy giữ nó đơn giản:

public class B<T> { 
    public void test(List<Integer> i) { 
    } 
} 

Lớp B có T vô ích chung, và thử nghiệm() muốn có một Danh sách Integer.

Bây giờ nếu tôi làm:

public class A extends B { 
    // don't compile 
    @Override 
    public void test(List<Integer> i) { 
    } 
} 

tôi nhận được một "Các thử nghiệm phương pháp (danh sách) loại A phải ghi đè lên hoặc thực hiện một phương pháp siêu kiểu" lỗi, đó không nên xảy ra.

Nhưng loại bỏ loại danh sách hoạt động ... mặc dù nó không phụ thuộc vào lớp chung chung.

public class A extends B { 
    // compile 
    @Override 
    public void test(List i) { 

Và cũng định chung vô dụng dưới đây để sử dụng danh sách gõ

public class A extends B<String> { 
    // compile 
    @Override 
    public void test(List<Integer> i) { 

Vì vậy, tôi tránh khỏi thất bại, sự chung của B nên không có ảnh hưởng vào loại bài kiểm tra() danh sách. Có ai có ý tưởng về những gì đang xảy ra không?

Cảm ơn

+0

Tôi tin câu trả lời của bạn nằm ở đây [http://stackoverflow.com/a/502770/248082). – nobeh

+0

Thông thường [capital V] 'Void' được sử dụng cho các tham số chung mà bạn không muốn sử dụng. Ví dụ, sử dụng 'java.security.PreivilegedAction' mà không trả về một giá trị (trả về' null' - đó là tham chiếu 'Void' hợp lệ duy nhất). –

Trả lời

8

Bạn đang mở rộng loại thô của B, không phải là loại chung. Tài liệu thô có hiệu quả không có phương thức test(List<Integer> i), nhưng là phương thức test(List).

Nếu bạn chuyển sang loại thô, tất cả generics được thay thế bằng raws, bất kể loại của chúng có được điền vào hay không.

Để làm điều đó đúng, làm

public class A<T> extends B<T> 

này sẽ sử dụng chung loại B<T>, trong đó bao gồm các phương pháp bạn muốn ghi đè.

+0

Cảm ơn. Không thực sự hợp lý vì chúng ta không sử dụng T, nhưng Generics của java có một số lỗi thiết kế mà chúng ta phải giải quyết. – PomPom

1

Khi bạn loại bỏ sử dụng một lớp mà không generics (và sử dụng nó thô), tất cả Generics từ phương pháp lớp học đang bị lãng quên.

Vì lý do này khi bạn thông báo cho loại chung về trường hợp thứ hai, bạn sẽ làm cho nó hoạt động.

này:

class T<G> { 
    public void test(G g); 
} 

trong trường hợp này:

class A extends T { 
} 

sẽ trông như thế này:

class T { 
    public void test(Object g); 
} 

Đây là một câu đố java trình bày trên Google IO 2011 bạn có thể xem video here

+0

Vấn đề thực sự là tôi không sử dụng G nhưng là một lớp cụ thể. Dù sao tôi đã nhận được câu trả lời của tôi – PomPom

+0

Bạn đang sử dụng một lớp học thô. –

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