2014-08-27 77 views
0

我知道你可以將LinkedList的實現分爲兩類。在一中,實際工作LinkedList的是一個參考第一部分鏈接節點,這樣是否有可能擴展一個具有自身實例的類作爲一個字段,以便子類具有該子類的實例?

public class LinkedList1<E>{ 

    class Node{ 
     E data; 
     Node next; 
    } 

    Node head; 

} 

該版本可能是更好的,但是另外,還有一個更「直接」的版本,使之類的東西刪除頭(頭意味着從客戶的角度來看,第一個元素)有點麻煩,但仍然LinkedList2的實例中可能:

public class LinkedList2<E>{ 

    E data; 
    LinkedList2 next; 

} 

我很好奇,如果有任何的方式來創建LinkedList2Child extends LinkedList2使得next字段類型LinkedList2Child,可能涉及反思?

編輯:這並不妨礙我完成任何事情,因爲版本1可用 - 我只是對一般問題好奇,這是一個例子。

我知道你可以通過聲明一個與父字段同名的字段來隱藏子類中的字段,但是如果你想使用在該字段上操作的父方法,這將不起作用。

+0

爲什麼你不想使用第一個版本?你所做的一切都是消除鏈表,現在你只有節點,將列表本身的管理權限降級到客戶端代碼。這沒有意義。我認爲這是一個XY問題......請解釋你正在嘗試解決的實際問題,這些問題無法通過Collection類來解決。 – 2014-08-27 20:34:34

+0

您不必將管理權限歸入客戶端代碼。你仍然可以實現添加,刪除,從類內的任何東西。並不是我不想使用第一個版本。這可能會更好。我只想知道如果以我描述的方式擴展後者是可能的。 – user3391564 2014-08-27 20:36:15

回答

1

泛型:

public class LinkedList2<E, T extends LinkedList2>{ 

    E data; 
    T next; 

} 

public class LinkedSubclass extends LinkedList2<LinkedSubclass> { 

} 

這是受你可以用仿製藥做平常的限制(例如,在基類將需要採取在孩子類型的類構建新的「下一個」值,或工廠),但會涵蓋你想要的。

0

這被稱爲共方差(或共變體返回類型):

public static abstract class A 
{ 
    public A get() { ... } 
} 

public static abstract class B extends A 
{ 
    @Override 
    public B get() { ... } 
} 

B#get()方法重寫A#get()。這與泛型是正交的(即概念上不相關)。

+0

我不認爲它與泛型相關。我不確定我是否看到如何在子類中有效地擁有子類的實例,而不是父類的實例。如果我有一個二叉樹並創建一個自平衡二叉樹子類,該子類使用執行平衡操作的插入覆蓋插入。當在自平衡樹的子樹中遞歸調用插入時,該子樹也需要執行平衡操作,因此需要成爲自平衡子類的實例。 – user3391564 2014-08-27 21:10:20

相關問題