2

我想用迭代器实现一个自定义列表,以便我自己更好地理解它,但是我遇到了泛型类型的问题,这是我第一次使用自己。这是我课堂的重要部分

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 给出了一个错误:“无法对类型参数 T 执行 instanceof 检查。请改用它的擦除对象,因为更多的泛型类型信息将在运行时被擦除”

如果不使用@SupressWarnings,我该怎么做才能消除警告?

        }

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

    //unrelated code
}
4

2 回答 2

3

You can get rid of all of the casting and instanceof by generifying Node.

Something like:

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

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

  public T getData () {
    return data;
  }
}
于 2013-10-10T09:57:59.137 回答
2

instanceof是运行时检查,因此由于类型擦除,编译器无法知道它是否可以执行检查。

与您的投射示例类似 - 如果您不知道您的程序将使用什么类型,您怎么知道您可以执行此投射?这可能会导致ClassCastException.

编辑:根据评论和你的最后一个问题

如果不使用@SupressWarnings,我该怎么做才能消除警告?

嗯,你current是一个String. 根本不要将其转换为未知类型。希望它有所帮助并解释更多。

于 2013-10-10T09:56:36.553 回答