使用接口实现时的"不可转换类型"

yoo*_*er8 0 java interface

在尝试将接口的实现强制转换为接口时,我遇到了意外错误("无法转换的类型").

我给了以下界面

public interface IAbc {...}
Run Code Online (Sandbox Code Playgroud)

和另一个类中的以下方法

public class SomeClass {
    public doSomething(Iterable<IAbc> abcs) {...}
}
Run Code Online (Sandbox Code Playgroud)

我写了下面的课

public class MyAbc implements IAbc {...}
Run Code Online (Sandbox Code Playgroud)

我在其他地方有这样的方法

public class MyClass {
    public Iterable<MyAbc> getMyAbcs() {...}
}
Run Code Online (Sandbox Code Playgroud)

我希望我可以很好地链接这些,如下所示:

public void doSomethingWithThings(SomeClass sc, MyClass mc) {
    sc.doSomething(mc.getMyAbcs());
}
Run Code Online (Sandbox Code Playgroud)

但是NetBeans给了我以下错误:

错误:
sc.doSomething(mc.getMyAbcs());
需要不可转换的类型:Iterable
found:Iterable

我尝试过施法,但Iterable<IAbc> abc = (Iterable<IAbc>)mc.getMyAbcs();会导致同样的错误.

如何将接口的Iterable实现传递给期望接口的Iterable的方法?

Esa*_*ija 6

Iterable<MyAbc>不是一个Iterable<IAbc>,即使MyAbc是一个IAbc.

尝试像这样的通配符:

public doSomething(Iterable<? extends IAbc> abcs) {...}
Run Code Online (Sandbox Code Playgroud)

这与数组相反,数组:MyAbc[]是aIabc[]

这是一个很好的教程http://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html