2012-05-24 69 views
7

看起來這是不可能的,但有沒有人有一個聰明的方法解決這個問題?強制通用類型爲接口?

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

是什麼意思? Java不支持多重繼承。你想保證T擴展SomeClass並實現S? –

+0

就像它在描述中所說的那樣,S是一個接口 –

+1

@LudwigMagnusson,無論'X'是類還是接口,只能在泛型類型參數定義中使用'extends X'。 –

回答

0

你不能參數SomeClassS?然後,你可以有

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

我正在考慮參數化SomeClass作爲一個完全不同的解決方案。 SomeClass會自己實現Iterable。但是我不想使用這個解決方案,因爲SomeClass在現有的代碼庫中使用了很多。 –

+0

您也可以考慮使用組合而不是繼承,所以您現有的子類可以保存對「SomeClass」的引用,並進行參數化。 – artbristol

-1

我承認,我不完全理解的問題,但是這是我的建議: 創建的S的接口。它包含一個方法ad,它返回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; 
    } 
} 

你將不得不修改使用了一點,但也許它的工作原理。

0

我認爲在S伸展SomeClass的&小號

公共類SomeClassIterableWrapper

必須是一個明確的類,因爲在這種情況下, S有可被擴展東西類。

有沒有一種方法可以縮小 代替S所用的潛在類? 如果您有多個T應擴展的 類,則可以使用多個&符號

+0

是的,這正確地確定了問題。不幸的是,S所描述的接口數量並不是可以縮小的,事實上只會隨着時間的推移而增長。 –