Generic Generics:“令牌上的语法错误”扩展“,预期”

时间:2013-02-19 08:33:39

标签: java generics

public interface View{...

public interface Control<V extends View>{...

public class RemoteControl<C extends Control<V extends View>> implements Control<V>{...

给我一​​个“令牌上的语法错误”扩展“,预期”在RemoteControl类的“V extends View”上。

我想以下替代方案是可能的

public class RemoteControl<C extends Control<V>,V extends View> implements Control<V>
{...

我仍然想知道这是否不能以更隐式的方式完成,因为后者需要View的冗余声明。即:

public class TVRemoteControl extends RemoteControl<TVControl,TvView> implements TVControl{...

VS

public class TVRemoteControl extends RemoteControl<TVControl> implements TVControl{...

也许我只是被困在一个盒子里,但是有可能以更优雅的方式获得“泛型泛型”

1 个答案:

答案 0 :(得分:4)

你建议:

  

我想以下替代方案是可能的

public class RemoteControl<C extends Control<V>,V extends View> implements Control<V>{}

这是正确的解决方案,虽然我通常把它写成(为了便于阅读):

public class RemoteControl<V extends View, C extends Control<V>> implements Control<V>{}

您在RemoteControl对象上键入Control,该对象也在extends View对象上键入。因此,您需要提供View的实现,该实现会键入键入您的Control对象的RemoteControl对象。

我想你可以解释你的问题,为什么我必须提供V - 不应该从<C extends Control<V>>隐含。答案是,您需要为V提供一种类型,以确保提供正确类型的Control(即extends Control<V>

如果您不关心输入View对象的Control类型,则无需在Control中输入RemoteControl

public class RemoteControl<C extends Control> implements Control{}

但是,事件Control是在V extends ViewRemoteControl implements Control<V>上输入的,而是建议你这样做......