Java LinkedList迭代器:为什么它们只返回对象?

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等于().如果强行施法它不起作用,那又怎样呢?

And*_*yle 5

从迭代器返回的元素的运行时类型不会(实际上也不会)更改.它们被分配给类型的字段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注释添加到方法中,这将捕获此类错误.