2014-06-15 31 views
0

我們得到了下面的類簽名:通用問題 - 推斷類型不符合宣告勢必

車:

public class car<E extends Parts> [...] 

部分:

public abstract class parts<E extends Stuff> [...] 

public class Tire<T extends StoneTire> extends parts<T>[...] 

東西:

public abstract class Stuff [...] 

public class Painting extends Parts [...] 

[...] 

我們想要救車在Treeset中<零件< E >>(在「Car」類中),但是編譯器說nope:[因爲如果我們試圖在工具城中保存輪胎,他不能在Tool的邊界中找到StoneTire類型。

+0

您的方法中使用的「M」在哪裏聲明? –

+0

@SotiriosDelimanolis方法:public final > void addMuseum(final M博物館) – horrorhorst

+0

請向我們展示'toolCity'是什麼。 –

回答

2

你的方法

public final <M extends Museum<E>> void addMuseum(final M museum) 

都有自己的類型參數M,但它也取決於類的類型參數EM綁定在方法調用上,但E綁定在實例(或表達式)的聲明處。

你有

toolCity.addMuseum(m1); 

其中toolCity似乎是SO被調用的方法,完全綁定的

public class ToolCity extends City<Tool> 
           // E 

一個實例,是

public final void addMuseum(final Museum<Tool> museum) ... 

但你m1 ,從異常消息看來,似乎是

Museum<StoneTool> m1 = ... 

Museum<StoneTool>不是Museum<Tool>亞型,因此不能被用作一個參數的東西,預計後者。

+0

toolCity是一個新的「城市」實例! 「工具」是一個抽象類,「StoneTool」擴展了「工具」,因此它是一個子類型!!?該方法應該接受「博物館」及其任何子類型和「工具」中的任何子類型? – horrorhorst

+0

@horrorhorst不,對於「城市」該方法接受'Museum '的子類型。 '博物館'是**不是**博物館'的子類型。 –