2015-08-31 12 views
6

Dưới đây là các tầng lớp phụ huynh DblyLinkListLàm cách nào để kế thừa lớp bên trong của cha mẹ trong mã này?

package JavaCollections.list; 

import java.util.Iterator; 
import java.util.NoSuchElementException; 

public class DblyLinkList<T> implements Iterable<T>{ 

    class DListNode<T> { 

     private T item; 
     private DListNode<T> prev; 
     private DListNode<T> next; 

     DListNode(T item, DListNode<T> p, DListNode<T> n) { 
      this.item = item; 
      this.prev = p; 
      this.next = n; 
     } 


    } 
..... 
} 

Dưới đây là lớp có nguồn gốc LockableList,

package JavaCollections.list; 

    import JavaCollections.list.DblyLinkList.DListNode; 

    public class LockableList<T> extends DblyLinkList<T> { 

     class LockableNode<T> extends DblyLinkList<T>.DListNode<T> { 

      /** 
      * lock the node during creation of a node. 
      */ 
      private boolean lock; 

      LockableNode(T item, DblyLinkList<T>.DListNode<T> p, 
        DblyLinkList<T>.DListNode<T> n) { 
       super(item, p, n); // this does not work 
       this.lock = false; 
      } 

     } 

     LockableNode<T> newNode(T item, DListNode<T> prev, DListNode<T> next) { 
      return new LockableNode(item, prev, next); 
     } 

     public LockableList() { 
      this.sentinel = this.newNode(null, this.sentinel, this.sentinel); 
     } 


    ..... 
} 

Nếu class LockableNode<T> extends DListNode<T> trong đoạn mã trên, lỗi: The constructor DblyLinkList<T>.DListNode<T>(T, DblyLinkList<T>.DListNode<T>, DblyLinkList<T>.DListNode<T>) is undefined xảy ra tại dòng super(item, p, n)

này lỗi được giải quyết bằng cách nói: class LockableNode<T> extends DblyLinkList<T>.DListNode<T>

Làm cách nào để hiểu lỗi này? Tại sao nó được giải quyết?

+0

Hãy thử làm cho 'DListNode' được bảo vệ:' lớp bảo vệ DListNode {...} ' –

+0

'Công việc này (mục, p, n);' thay vì 'siêu'? – Craig

+0

@NicholasRobinson Đó không phải là vấn đề bởi vì nếu đó là trường hợp, thông báo lỗi sẽ khác nhau. Cũng lưu ý rằng họ đang ở trong cùng một gói, do đó, nó chắc chắn không phải là một vấn đề tầm nhìn. – m0skit0

Trả lời

5

Bạn đang xác định lại biến loại T trong lớp bên trong. Điều đó có nghĩa rằng trong lớp bên trong, các T của lớp bên ngoài được ẩn và không thể được gọi nữa.

Vì bạn có một lớp bên trong không tĩnh, bạn chỉ có thể loại bỏ các loại biến T có:

class DListNode { ... } 

vì nó thừa hưởng nó từ lớp chứa (và có lẽ bạn có nghĩa là các biến đều giống nhau , dù sao).

+0

Xin lỗi tôi đã không giúp bạn. 'lớp DListNode thực hiện Iterable {..}' hoặc 'lớp DListNode {..}' – overexchange

+0

Xin lỗi, tôi có nghĩa là 'DListNode', mà không thực hiện' Iterable '. – Hoopje

+0

Nếu bạn thấy 'java.util.Map ', bạn có 'Entry 'làm giao diện' bên trong'. Vậy tại sao tôi không thể tạo 'DListNode ' thay vì 'DListNode'? – overexchange

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