2013-03-05 59 views
0

嘗試將接口實現強制轉換爲接口時遇到意外錯誤(「不可轉換類型」)。使用接口實現時的「不可轉換類型」

我給出如下界面

public interface IAbc {...} 

和下面的方法在另一類

public class SomeClass { 
    public doSomething(Iterable<IAbc> abcs) {...} 
} 

我寫了下面的類

public class MyAbc implements IAbc {...} 

我有其他類似方法

public class MyClass { 
    public Iterable<MyAbc> getMyAbcs() {...} 
} 

我希望我能如下很好地鏈接這些了:

public void doSomethingWithThings(SomeClass sc, MyClass mc) { 
    sc.doSomething(mc.getMyAbcs()); 
} 

但NetBeans的是給我下面的錯誤:

error: inconvertible types
sc.doSomething(mc.getMyAbcs());
required: Iterable
found: Iterable

我嘗試鑄造,但Iterable<IAbc> abc = (Iterable<IAbc>)mc.getMyAbcs();導致相同的錯誤。

如何將接口實現的Iterable接口傳遞給期望接口Iterable的方法?

回答

6

Iterable<MyAbc>一個Iterable<IAbc>,即使MyAbcIAbc

嘗試像這樣一個通配符:

public doSomething(Iterable<? extends IAbc> abcs) {...} 

這是陣列的對面,數組:MyAbc[]Iabc[]

這裏有一個很好的教程更http://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html

+0

不幸的是,這不是一個選項(我不能改變'SomeClass'或'IAbc')。 – yoozer8 2013-03-05 16:00:50

+0

@Jim然後你需要在調用函數之前手動將它轉換爲'Iterable ',並將'Iterable '傳遞給它。或者只是嚴格使用'Iterable ',讓類中的方法返回'Iterable ' – Esailija 2013-03-05 16:01:51

+0

@Jim你還應該通知api的作者使用正確的有界通配符使它像預期的那樣工作:P – Esailija 2013-03-05 16:15:32