我想用迭代器实现一个自定义列表,以便更好地理解它,但我遇到了泛型类型的问题,我第一次使用自己。 这是我班级的重要部分
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
}
答案 0 :(得分:2)
instanceof
是运行时检查,因为类型擦除编译器无法知道它是否可以执行检查。
与您的演员示例类似 - 如果您不知道您的程序将使用哪种类型,您怎么知道可以执行此演员表?这可能会导致ClassCastException
。
编辑: 根据评论和你的上一个问题
如果不使用@SupressWarnings,我该如何摆脱警告?
好吧,您的current
是String
。根本不要将其转换为未知类型。
希望它有所帮助并解释更多。
答案 1 :(得分:2)
你可以通过推广instanceof
摆脱所有的演员和Node
。
类似的东西:
class Node<T> {
private Node<T> next;
private T data;
public Node<T> getNext () {
return next;
}
public T getData () {
return data;
}
}