2012-07-14 55 views
0

我:我如何將參數傳遞爲泛型?

public class<E extends aninterface> AClass{ 

    public AClass(){ 
    } 

    public void amethod(E element){ 
     //something 
    } 

} 

public class B implements aninterface{ 

} 

呼叫代碼:

aninterface f = new B(); 
AClass<B> ac = new AClass<B>(); 
ac.amethod(f); 

它說f是類型aninterface但參數的類型是 'E'

我不明白仿製藥的哪一點,如果我不能做這個?

+0

這個例子首先與泛型有什麼關係?泛型不允許在沒有它們的情況下不應該做的任何事情。他們只是節省你一些打字。如果你重寫你的代碼沒有泛型,它不會工作的原因很明顯。 – user1096188 2012-07-14 21:55:58

+0

將'E'更改爲'aninterface'並且它可以工作.... – 2012-07-14 21:58:22

+0

是的,它會和?也許你認爲它應該工作,因爲f實際上是B?那麼,這將工作在python,紅寶石或PHP,但不是在Java和C#。 – user1096188 2012-07-14 22:05:05

回答

2

因爲AClass<B>.amethod()預計B作爲參數。但你傳遞給它一個aninterface。該參考f聲明

+0

但B實現了接口動態綁定? – 2012-07-14 21:57:22

+1

@peroni_santo:確實。但「動態」意味着「在運行時」。編譯器使用靜態類型信息,因此是錯誤消息。 – 2012-07-14 21:58:33

+0

@peroni_santo:'B'是'aninterface',但'aninterface'不一定是'B' – newacct 2012-07-15 00:54:49

2

注爲類型aninterface —和B類型的不的。儘管在運行時參考f指向B類型的實例,編譯器在此僅查找在參考fAClass#amethod(E)所要求的B的聲明類型之間的對齊。

也許你打算寫這個呢?

final aninterface f = new B(); 
final AClass<? super aninterface> ac = new AClass<aninterface>(); 
ac.amethod(f); 

或者,也許這個呢?

final B f = new B(); 
final AClass<? super B> ac = new AClass<B>(); 
ac.amethod(f); 

再次,注意,Baninterface,而不是相反的:一個aninterface不是B。因此,您無法向需要參數類型B的方法提供類型爲aninterface的參考。

+0

謝謝你好貼子 – 2012-07-14 22:12:07

相關問題