7

看起来这是不可能的,但是有人有解决这个问题的聪明方法吗?

public class SomeClassIterableWrapper<S, T extends SomeClass & S> implements Iterable<S>

WhereS应该是某种未知类型的接口,并且SomeClass是具有行索引的二维数组,在功能上类似于双向 JDBC 结果集。的子类SomeClass对每一列都有自定义的 getter 和 setter。我希望能够像列表一样遍历这个结构。我想在我SomeClass和 Bean 之间实现一个通用接口来访问 getter 和 setter。因此 S 需要是那个接口。但是我提供的声明不起作用。有没有办法解决这个问题?

编辑以显示我想要的实现:

public class SomeClassIterableWrapper<S, T extends SomeClass & S> implements Iterable<S>{

T object;

public SomeClassWrapper(T object){
    this.object = object;
}

@Override
public Iterator<S> iterator() {
    object.setIndex(-1);
    return new SomeClassIterator<S>();
}

private class SomeClassIterator<S> implements Iterator<S> {

    @Override
    public boolean hasNext() {
        return object.index() < object.rowSize() - 1;
    }

    @Override
    public S next() {
        object.next();
        //safe because only interface methods allowed, can't further manipulate index
        return object; 
    }

    @Override
    public void remove() {
        object.deleteRow();
    }
}
4

3 回答 3

0

你不能用 参数化SomeClassS?那么你可以有

public class SomeClassIterableWrapper<S, T extends SomeClass<S>> 
      implements Iterable<S>{
于 2012-05-24T14:21:43.743 回答
0

我认为 S in extends SomeClass & S

公共类 SomeClassIterableWrapper

必须是一个明确的类,因为在这种情况下,S 必须是一个扩展某些东西的类。

有没有一种方法可以缩小用于代替 S 的潜在类的范围?如果您有多个 T 应该扩展的类,则可以使用多个 &

于 2012-05-24T17:28:04.627 回答
-1

我承认我没有完全理解这个问题,但这就是我的建议:创建一个S. 它包含一个方法,它返回S对象。

public interface SWrapper<S> {

  S getS();

}

然后创建一个实现:

public class SImpl implements SWrapper<SImpl> {

    @Override
    public SImpl getS() {
        return this;
    }

}

您现在可以创建:

public class SomeClass<T extends SomeClass & SWrapper<T>> {

    private final T object;

    public SomeClass(T object) {
        this.object = object;
    }
}

您将不得不稍微修改您的用法,但也许它可以工作。

于 2012-05-24T16:11:57.170 回答