2013-02-19 68 views
7
public interface View{... 

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

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

给了我一个“语法错误令牌‘扩展’,预计”上“V扩展视图”为REMOTECONTROL类。通用泛型:伸出“令牌语法错误‘’,预计”

我想下面的选择是可能的

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

不过我不知道如果这不能更含蓄的方式来完成,因为后者将需要查看的冗余声明。即:

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

VS

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

也许我只是停留在一个盒子里再次,但有可能获得“通用泛型”在一个更优雅的方式

+0

我试图想出一个解决方案,但我想你已经说过了:它不能按照你想要的方式完成,你必须按照后面描述的方式来完成。尽管我在这里找不到任何关于你的问题的线索,但我会把你推荐给这个有用的站点:http://www.angelikalanger.com/GenericsFAQ/FAQSections/ProgrammingIdioms.html – Sentry 2013-02-19 09:12:24

+1

'public class RemoteControl >'。对于遥控器来说,真的很重要远程控制的控制器正在使用哪种视图? – SpaceTrucker 2013-02-19 09:27:17

+0

我对所有java泛型问题都表示同情...... – hbhakhra 2013-02-19 19:32:49

回答

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>{} 

你这也输入了一个对象,extends ViewControl对象上键入RemoteControl。因此,您需要提供View的实现,其中键入您的RemoteControl对象的类型Control对象。

我想你可以解释你的问题说,为什么我必须提供V - 不应该暗示<C extends Control<V>>。哪个,答案是没有,你需要为V提供一个类型,以确保Control正确类型提供(即它extends Control<V>

如果你不在乎什么类型的View对象Control打在,你不需要在RemoteControl键入Control

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

然而,事实ControlV extends ViewRemoteControl implements Control<V>类型,而建议你做......

相关问题