看起来这是不可能做到的,但有没有人巧妙地解决这个问题?
public class SomeClassIterableWrapper<S, T extends SomeClass & S> implements Iterable<S>
其中S
应该是某种未知类型的接口,SomeClass
是带有行索引的2D数组,功能类似于双向JDBC结果集。 SomeClass
的子类具有每列的自定义getter和setter。我希望能够像List一样迭代这个结构。我想在我的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();
}
}
答案 0 :(得分:0)
您无法使用SomeClass
参数化S
吗?那么你可以拥有
public class SomeClassIterableWrapper<S, T extends SomeClass<S>>
implements Iterable<S>{
答案 1 :(得分:0)
我认为S in扩展了SomeClass&amp;小号
公共类SomeClassIterableWrapper
必须是一个明确的类,因为在这种情况下, S必须是一个扩展内容的类。
有没有办法可以缩小范围 用来代替S的潜在类是什么? 如果你有多个&符号,你可以使用多个&符号 T应扩展的类
答案 2 :(得分:-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;
}
}
您必须稍微修改一下使用情况,但也许可行。