2011-12-14 33 views
5

tôi xác định một lớp:Java Generics loại tham số ẩn

class Foo<I extends Bar & Comparable<I>> { 
} 

trình biên dịch được phàn nàn về I bị ẩn bởi I. Tôi đoán lần thứ hai I xuất hiện trong định nghĩa là ẩn trong phạm vi đầu tiên, như thể biến I có thể được gán cho hai loại khác nhau. Làm thế nào để làm điều đó một cách chính xác?

Chỉnh sửa:

đây là lớp bên trong. mã đầy đủ có thể là:

class Baz<I> { 
    class Foo<I extends Bar & Comparable<I>> { 
    } 
} 

bây giờ vấn đề là nếu tôi tái đề cử nội I-J, tôi không chắc chắn rằng IJ thực sự các loại tương tự.

+4

Biên dịch cho tôi - có loại 'I' được định nghĩa ở nơi khác trong mã của bạn không? –

+1

Tương tự, không cảnh báo cho tôi. – n1r3

+1

thứ ba. Biên dịch tốt. – asenovm

Trả lời

9

Đừng làm cho các lớp bên trong tham số:

class Baz<I extends Bar & Comparable<I>> { 
    class Foo { 
    } 
} 

Là một (lồng nhau không tĩnh) lớp bên trong, I theo quy định tại tờ khai Baz sẽ vẫn có ý nghĩa trong Foo, vì mỗi Foo sẽ có tham chiếu ngầm định đối với phiên bản Baz bên ngoài của nó.

+0

Tôi sẽ chấp nhận điều này vì câu trả lời này là câu trả lời cho câu hỏi của tôi. nó có thể trông giống như một câu hỏi ban đầu nhưng vấn đề của tôi thì khác và tôi phát hiện ra sau. Vấn đề của tôi là lớp bên trong thực sự là một giao diện bên trong. Không thể tránh các kiểu ghi rõ ràng trong giao diện bên trong, và điều đó làm rối tung mọi thứ cho các lớp bên trong thực hiện các giao diện bên trong ... – marcorossi

3

Nếu I đã được xác định trong các lớp bên ngoài chỉ cần đảm này

public class Outer<I extends Bar & Comparable<I>> { 
    public class Foo<I> { 
    } 
} 

Bạn không thể xác định lại I ở lớp bên trong của bạn. Các I của lớp bên trong sẽ là một cái gì đó khác hơn là I của lớp bên ngoài, nếu đây là những gì bạn muốn, tốt, đổi tên nó.

HTH