java - 如何让 Java Iterable 从扩展泛型返回基本子类型

标签 java generics iteration

我正在尝试创建一个可迭代的子类。这类似于question 。但是,我需要让列表中的对象成为特定类的子类,例如在我下面的例子中是QObject。此外,我需要我的迭代器来实现与 ListIterator 接口(interface)相关的特定方法。

问题是我的实现 ListIterator 接口(interface)的内部类在我的实现中没有“返回”基本泛型类型 QObject。我执行 QueueListIterator 泛型的方式有问题。

现在,如果我在示例代码中使用 Queue 声明队列,它就可以工作。这必须提供允许迭代器获得正确类型所需的信息。但是,仅将其声明为 Queue 就不会,即使基本泛型类型是 QObject 并且 Queue 类中的其他方法使用基本泛型类型。

所以,我的问题是为什么会发生这种情况,有没有办法指定 QueueListIterator 来识别基本泛型类型?

    public class Queue<T extends QObject> implements Iterable<T> {
        /**
         * The list of items in the queue.
         */
        protected List<T> myList;

        // other methods and defs

        public final Iterator<T> iterator() {
            return (new QueueListIterator());
        }

        public final ListIterator<T> listIterator() {
            return (new QueueListIterator());
        }

        private class QueueListIterator implements ListIterator<T> {

            protected ListIterator<T> myIterator;

            protected QueueListIterator() {
                myIterator = myList.listIterator();
            }

            @Override
            public void add(T o) {
                throw new UnsupportedOperationException("The method add() is not supported for Queue iteration");
            }

            @Override
            public boolean hasNext() {
                return myIterator.hasNext();
            }

            @Override
            public boolean hasPrevious() {
                return myIterator.hasPrevious();
            }

            @Override
            public T next() {
                return myIterator.next();
            }

            @Override
            public int nextIndex() {
                return myIterator.nextIndex();
            }

            @Override
            public T previous() {
                return myIterator.previous();
            }

            @Override
            public int previousIndex() {
                return myIterator.previousIndex();
            }

            @Override
            public void remove() {
                throw new UnsupportedOperationException("The method remove() is not supported for Queue iteration");
            }

            @Override
            public void set(T o) {
                throw new UnsupportedOperationException("The method set() is not supported for Queue iteration");
            }
        }
    }

    // testing code
    public static void test(){

            Queue q = new Queue();
            // put some stuff in the Queue
            QObject r1 = new QObject(q.getTime(), "A");
            q.enqueue(r1);
            QObject r2 = new QObject(q.getTime(), "B");
            q.enqueue(r2);

            // Does not work! 
            // incompatible object types, Object cannot be converted to QObject in the for( : ) construct
            for (QObject qo : q) {
                System.out.println(qo);
            }
    }

最佳答案

如果你这样声明 q 会怎样: 队列q

关于java - 如何让 Java Iterable 从扩展泛型返回基本子类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45471999/

相关文章:

c++ - 迭代和递归有什么区别?

c++ - 在对 vector 中查找函数时出错

java - 如何使用 Guava MapInterfaceTest 来测试您的类

Java - 检查对象数组是否包含特定字符串

generics - 通过其自身的通用生命周期(trait Bar <'a>: ' a)来限制特征是什么意思?

c# - 在泛型集合上使用 except()

algorithm - 如何迭代计算运行加权平均值,以便最后一个值最重?

java - Spring 不通过加载时编织器 Autowiring 集合

java - Com4j 因 DirectByteBuffer、Cleaner、Finalizer、Variant 实例而泄漏

java - 声明 RHS 上的泛型