2013-10-10 27 views
1

我想用迭代器實現一個自定義列表,以更好地理解它自己,但是我遇到了一個泛型類型的問題,我第一次使用自己。 這是我的課的重要組成部分如何檢查在Iterator中投射到T是否安全?

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

// Unrelated code 

@Override 
public Iterator<T> iterator() 
{ 
    return new Iterator<T>() 
    { 
     private Node position = firstNode; 

     public boolean hasNext() 
     { 
      return position.getNext() != null; 
     } 

     public T next() 
     { 
      String current = ""; 
      if (this.hasNext()) 
      { 
       current = position.getData(); 
       position = position.getNext(); 
      } 
      return (T) current; 

這裏Eclipse中說,這是一個未經檢查的演員,所以我試圖將其更改爲:

  return (T) (current instanceof T?current:null); 

但隨後的Eclipse提供了一個錯誤:「無法執行instanceof檢查類型參數T.使用它的擦除對象,因爲進一步的通用類型信息將被刪除在運行時「

我該如何擺脫警告,而不使用@SupressWarnings?

 } 

     public void remove() 
     { 
      throw new UnsupportedOperationException("Not supported yet."); 
     } 
    }; 
} 

    //unrelated code 
} 
+0

爲什麼使它通用,如果它總是將是String類型的? –

+0

您無法安全地將字符串轉換爲T!您可能需要'節點',獲得者返回一個'T' –

+0

您有什麼反對使用@SuppressWarnings?這就是它的*。* – EJP

回答

2

通過概括Node,您可以擺脫所有鑄件和instanceof

喜歡的東西:

class Node<T> { 
    private Node<T> next; 
    private T data; 

    public Node<T> getNext() { 
    return next; 
    } 

    public T getData() { 
    return data; 
    } 
} 
+1

必須進行大量的操作,因爲我的節點並不那麼簡單,但現在我有0個警告(OCD很多:p),謝謝! – vrwim

2

instanceof是一個運行時檢查,是因爲類型擦除編譯器無法知道它是否可以進行檢查。

類似於您的演員示例 - 如果您不知道您的程序將使用何種類型,您怎麼能知道您可以執行此演員表演?這可能會導致ClassCastException

編輯: 根據註釋和你最後一個問題

What do I do to get rid of the warning without using @SupressWarnings?

那麼,你的currentString。不要將它投射到一個未知的類型。 希望它有助於解釋更多。

+0

這不是一個答案 - 它應該是一個評論。 – OldCurmudgeon

+1

@OldCurmudgeon爲什麼它不是答案?說真的,也許我在這裏太新了 –

+0

你正在解釋什麼問題 - 沒有回答這個問題。我可能是錯的 - 畢竟這只是一個評論。 :) – OldCurmudgeon

相關問題