强制泛型类型作为接口?

时间:2012-05-24 12:42:48

标签: java generics

看起来这是不可能做到的,但有没有人巧妙地解决这个问题?

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();
    }
}

3 个答案:

答案 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;
    }
}

您必须稍微修改一下使用情况,但也许可行。