2010-01-05 19 views
15

Tôi đang cố triển khai lớp bên trong có kiểu tham số chung.Làm cách nào để sử dụng các loại generic được chứng thực trong một lớp bên trong?

Đây là một phiên bản ngắn của mã của tôi:

public class AVLTree<T extends Comparable<? super T>> implements Iterable<T> { 
... 

private class BinaryNode<T extends Comparable<? super T>> { 
    ... 
} 

private class TreePreOrderIterator<E extends Comparable<? super E>> implements Iterator<E> { 
    ... 
} 

} 

Nó không làm việc. Eclipse/Java cho tôi một cảnh báo rằng tham số kiểu T trên lớp bên trong là 'ẩn' tham số của lớp siêu. Bất kỳ suy nghĩ về cách tôi có thể sửa lỗi này?

EDIT: Tôi đã thêm lớp bên trong khác Tôi đang gặp sự cố với: TreePreOrderIterator. Loại chung T sẽ giống nhau cho AVLTree, BinaryNodeTreePreOrderIterator. Các lớp bên trong cần truy cập các trường trong AVLTree.

EDIT2: Ngoài ra, Iterator truy cập vào BinaryNode<T>, đó là xung đột.

(Lưu ý:. Đây là một phần của dự án lớn hơn tôi đang làm cho một lớp Nếu bất kỳ thông tin nào khác là cần thiết, hãy hỏi.)

+0

bạn có thể chỉnh sửa câu hỏi của mình để bao gồm cách loại BinaryNode chung được sử dụng không? ví dụ: BinaryNode có được tham số hóa cùng loại với AVLTree không? – Carl

+0

Chỉ cần chỉnh sửa. Điều này có trả lời câu hỏi của bạn không? –

Trả lời

28

Nếu bạn muốn T trong BinaryNode là loại giống như kèm theo T gắn liền với AVLTree, loại bỏ các tuyên bố T trong BinaryNode.

Nếu bạn muốn T trong BinaryNode là khác nhau hơn so với kèm theo T gắn liền với AVLTree, nhưng bạn muốn để có thể truy cập tài sản của phụ huynh AVLTree, đổi tên T để cái gì khác.

Nếu bạn không cần truy cập thuộc tính của kèm theo AVLTree, làm cho BinaryNode tĩnh.

+0

Được rồi, cảm ơn.Tôi đã thay đổi nó thành một thứ gì đó khác vì tôi cần truy cập các thuộc tính hoặc các trường trong AVLTree. Hiện tại, tôi đang gặp phải một số lỗi biên dịch chẳng hạn như "Loại không phù hợp: không thể chuyển đổi từ AVLTree.TreePreOrderIterator thành Iterator " và "Ràng buộc không khớp: Loại T không phải là thay thế hợp lệ cho tham số bị chặn > loại AVLTree .TreePreOrderIterator . " Mọi bản sửa lỗi? –

+0

Thử ''. – notnoop

+1

Tôi đã xóa tuyên bố T (tùy chọn đầu tiên). Bây giờ khi tôi viết "return new AVLTree.TreePreOrderIterator ();" Tôi nhận được lỗi "Loại thành viên AVLTree.TreePreOrderIterator phải đủ điều kiện với một loại tham số, vì nó không phải là tĩnh." Khi tôi loại bỏ "" từ mã trước đó, tôi nhận được cảnh báo "AVLTree.TreePreOrderIterator là một loại thô. Tham chiếu đến loại chung AVLTree .TreePreOrderIterator nên được tham số hóa." –

7

Chỉ cần đổi tên T đến cái gì khác vì vậy nó sẽ không xung đột với các lớp bên ngoài T.

Tên thông số loại được hiển thị trong tất cả phạm vi lớp, bao gồm các lớp bên trong. Vì vậy, các lớp bên trong hoặc các phương thức instance nên khai báo một tham số kiểu khác có xung đột tên với tham số kiểu lớp. Tuy nhiên, các lớp lồng nhau tĩnh và các phương thức tĩnh không có vấn đề đó.

0

Nó bởi vì các tham số T (như các tham số cho lớp BinaryNode<T>) là tương tự như sử dụng cho AVLTree<T> - tham số sử dụng cho AVLTree là bình thường trong phạm vi cho định nghĩa của lớp bên BinaryNode, nhưng vì bạn' lại cho một tham số mới cùng tên, nó sẽ bị ẩn. Bạn có thể sử dụng thay vì:

private class BinaryNode<U extends Comparable<? super T>> { ... } 
1

Chỉ cần xóa khai báo loại chung từ lớp BinaryNode. Vì lớp được khai báo là private, nó chỉ có thể tồn tại trong AVLTree, và bạn có thể sử dụng T được khai báo cho AVLTree ở bất kỳ đâu trong BinaryNode.

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