2013-12-19 114 views
2

如果我有一個名爲Cue的類實現了Tickable。後來,我有一個可觀察的列表,如下所示:ObservableList<Cue> oListoList implements Iterable<Cue>(這就是聲明如何ObservableList)。`Iterable`的接口鑄造

我有一個功能,需要Iterable<Tickable>。我如何才能接受ObservableList<Cue> Cue是Tickable,ObservableList是Iterable。出於某種原因,我不能在他們之間進行種姓或自動上傳。有沒有辦法做到這一點?

+0

你會如此善良,並分享一些代碼? – user1567896

回答

8

不能從Iterable<Cue>強制轉換爲Iterable<Tickable>,因爲即使CueTickable,一個Iterable<Cue>不是Iterable<Tickable>,因爲Java的泛型是不變的。

要使方法接受ObservableList<Cue>,請使方法參數類型爲Iterable<Cue>或使用有界通配符 - Iterable<? extends Tickable>

+1

@Downvoter請解釋如何改進。 – rgettman

-1

可以做到這一點,通過刪除泛型類型信息:

public static void main(String[] args) { 
    ObservableList<Cue> oList = new ObservableList<Cue>(); 
    naughtyCall(oList); 
} 

@SuppressWarnings({ "rawtypes", "unchecked" }) 
static void naughtyCall(ObservableList oList) { 
    doSomething(oList); 
} 

static void doSomething(Iterable<Tickable> iterable) { 
    // TODO 
} 

我不會建議這一點,但是!請參閱rgettman的回覆,以瞭解應該如何處理


更新:對於任何有興趣玩這個,這裏是我用來重現OP的情況,其餘代碼:

class Cue implements Tickable { 

} 

interface Tickable { 

} 

static class ObservableList<T> implements Iterable<T> { 

    @Override 
    public Iterator<T> iterator() { 
     return null; 
    } 
} 
4

由於rgettman說,你應該改變函數參數類型到Iterable<? extends Tickable>

這是因爲Iterable是生產者(它只從方法返回T)。因此,根據PECS(生產商extends,消費者super)規則,應始終使用通配符extends對其進行參數化。在正常使用情況下,沒有理由使用Iterable<Something>而不是Iterable<? extends Something>。 (Iterable<Something>將是必要的唯一情況是,如果你打算把它倒回到它的具體類型或類似奇怪的東西。)