2014-06-15 26 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 '的子类型。 '博物馆'是**不是**博物馆'的子类型。 –