我正在尝试创建一个可迭代的子类。这类似于question 。但是,我需要让列表中的对象成为特定类的子类,例如在我下面的例子中是QObject。此外,我需要我的迭代器来实现与 ListIterator 接口(interface)相关的特定方法。
问题是我的实现 ListIterator 接口(interface)的内部类在我的实现中没有“返回”基本泛型类型 QObject。我执行 QueueListIterator 泛型的方式有问题。
现在,如果我在示例代码中使用 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 会怎样:
队列
关于java - 如何让 Java Iterable 从扩展泛型返回基本子类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45471999/