簡體   English   中英

強制泛型類型作為接口?

[英]Force a generic type to be an interface?

看起來這是不可能做到的,但有沒有人能夠巧妙地解決這個問題?

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

你不能用S參數化SomeClass嗎? 那你就可以了

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

我認為S in擴展了SomeClass&S

公共類SomeClassIterableWrapper

必須是一個明確的類,因為在這種情況下,S必須是一個擴展某事的類。

有沒有辦法可以縮小用於代替S的潛在類別? 如果你有多個T應該擴展的類,你可以使用多個&符號

我承認我沒有完全理解這個問題,但這是我的建議:創建一個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;
    }
}

您將不得不稍微修改一下您的使用情況,但也許它有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM