Ham*_*ter 1 java iterator linked-list type-conversion
在这里,我只是发布我的代码:
int len = InternalList.size();
ListIterator<E> forward = InternalList.listIterator( 0 );
ListIterator<E> backward = InternalList.listIterator( len );
while( forward.hasNext() && backward.hasPrevious() )
{
E next = forward.next();
E prev = backward.previous();
// When the object references are the same, we expect to be at the
// center of the list (for odd-numbered lists?); we're done
if( next == prev )
return true;
// Otherwise, if the object values aren't the same, we're not a
// palindrome
if( !((E)next).equals( prev ) )
return false;
}
Run Code Online (Sandbox Code Playgroud)
这是内部列表:
private LinkedList<E> InternalList;
Run Code Online (Sandbox Code Playgroud)
所以基本上我的问题是最后一个if语句只检查Object的equals()方法; 不是E等于().如果强行施法它不起作用,那又怎样呢?
从迭代器返回的元素的运行时类型不会(实际上也不会)更改.它们被分配给类型的字段E,这些字段很可能Object在运行时被擦除(取决于通用边界),但这不会影响对象本身.
当equals()被调用时,它是一个非静态方法等上调用任何类的的next对象恰好是.如果此类没有重写的equals方法,那么肯定Object.equals会使用默认值.但是,如果此对象的类直接或间接覆盖equals,则将使用最具体的覆盖.
换句话说,这段代码应该没问题(并且完全没有必要使用强制转换).
我建议你仔细检查一下你equals在课堂上是否已正确覆盖.我猜你已经把它实现为:
public class MyFoo {
...
public boolean equals(MyFoo other) {
...
}
}
Run Code Online (Sandbox Code Playgroud)
而参数必须是Object类型,否则你只是重载equals方法而不是覆盖它.如果您使用的是Java 6,则可以将@Override注释添加到方法中,这将捕获此类错误.