2013-12-19 82 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>将是必要的唯一情况是,如果你打算把它倒回到它的具体类型或类似奇怪的东西。)