2015-01-08 63 views
0

我試着創建一個LinkedList類。但我有2個問題:java中的通用類型 - 對象類型不匹配

1)Node last=null聲明給我一個原始類型的錯誤,但在該聲明的上面沒有像這樣的錯誤。 4個相同的聲明,但只有最後一個聲明出錯。

2)在get()方法中,我想返回V型,因爲您可以看到值變量已經是V型。但它給了我「無法將Object轉換爲V」的錯誤。但臨時值已經是V.

public class Linkedlist<V> { 

    public class Node <V> { 

     private Node next=null; 

     private String key; 

     private int size; 

     private V value=null; 

     public Node(V value, String key){ 
      this.key=key; 
      this.value=value; 
     } 
    } 

    Node root=null; 
    Node temp=null; 
    Node temp1=null; 
    Node last=null; 

    last=root; 

    public void add(V value, String key){ 
     last.next = new Node(value,key); 
     last=last.next; 
    } 


    public void remove(String key){ 
     temp=root; 
     if(isEmpty()) 
     System.out.println("list is empty!"); 

     else{ 
      if(temp.next!=null){ 

       if(!temp.next.key.equals(key)){ 
        remove(temp.next.key); 
       } 

       else if(temp.next.key.equals(key)){ 
        if(temp.next==last) 
        last=temp; 
        temp.next=temp.next.next; 
       } 
      } 
      else 
      System.out.println("there is no such element"); 
     } 
    } 


    public V get(String key){ 
     temp=root; 

     if(temp.key.equals(key)){ 
      if(temp.next!=null) 
      get(temp.next.key); 

      else 
      return null; 
     } 
     else if(temp.key.equals(key)) 
     return temp.value; 

    } 
+0

您能否修復您的代碼的縮進。這是非常難以閱讀。 – kraskevich

+0

我是編碼方面的新手。對不起,讓你在閱讀的過程中遇到的一切。也對我可怕的英語感到抱歉。 –

回答

0

您的內部類Node是通用的,但您使用的是類的原始形式。這意味着一個返回V的方法將被清除,現在它返回Object。但Node類不需要是通用的。非嵌套類(即嵌套類)可以使用其封閉類的泛型類型參數。因此,請刪除類別定義中<V>Node

public class Node { 

其他問題,我看到:

  • last=root;似乎是任何構造函數,方法或初始化塊之外。
  • 我沒有看到isEmpty()方法,但您可能沒有爲簡明起見而公佈它。
  • get()方法在ifelse條件都不滿足的情況下需要使用return語句。
+0

更不用說'get()'方法中的else if塊具有與其最初的if相同的條件,因此無法到達代碼 – gknicker

+0

從Node類中擦除幫助並感謝。不過,我試圖在構造函數中聲明變量,但其他方法沒有看到變量。我必須讓他們全球化。我怎樣才能做到這一點? 此外,isEmpty()方法存在,但我不想將它複製到這裏。 –

+0

在構造函數中聲明的變量是僅在構造函數體中的作用域中的局部變量。你可以讓它們成爲實例變量,就像你已經爲'root','temp','temp1'和'last'所做的那樣。 – rgettman

0

您引用的兩個問題實際上是同一個。鑑於Node<V>比如你聲明的參數化類,這些...

Node root=null; 
Node temp=null; 
Node temp1=null; 
Node last=null; 

...所有申報的原始類型Node的對象。其他代碼將解釋爲將它們的類型參數指定爲Object。而應該聲明它們像這樣:

Node<V> root=null; 
Node<V> temp=null; 
Node<V> temp1=null; 
Node<V> last=null; 

其中<V>是文字 - 對類的類型參數,沒有任何具體類型的引用。如果你這樣做,那麼你的錯誤將會消失。

+0

我試過了,但沒有改變任何東西。我又犯了一個錯誤。 rgettman的建議後,我也從Node類中刪除,它幫助擺脫了「將對象轉換爲V」的錯誤。 –