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

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

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

gibt mir einen" Syntaxfehler auf Token "erweitert", "erwartet" auf "V erweitert Ansicht" für die RemoteControl-Klasse.Generische Generics: "Syntaxfehler auf Token" erweitert "," erwartet "

Ich denke, die folgende Alternative möglich war

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

Noch ich frage mich, ob dies nicht in einer impliziten Art und Weise durchgeführt werden kann, da diese eine redundante Erklärung der Ansicht erfordern würde. Dh:

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

vs

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

Vielleicht bin ich gerade in einer Box wieder stecken, aber ist es möglich, den "generic Generics" in einem eleganteren Weg, um

+0

Ich habe versucht, eine Lösung zu finden, aber ich denke, du hast es bereits gesagt: Es kann nicht so gemacht werden, wie du es willst und du musst es so machen, wie du es später beschrieben hast. Auch wenn ich hier keine Hinweise auf Ihr Problem finden konnte, verweise ich Sie auf diese hilfreiche Seite: http://www.angelikalanger.com/GenericsFAQ/FAQSections/ProgrammingIdioms.html – Sentry

+1

Wie wäre es mit 'öffentlichen Klasse RemoteControl > '. Sollte es für eine Fernbedienung wirklich von Bedeutung sein, welche Art von Ansicht die Steuerung verwendet, die ferngesteuert wird? – SpaceTrucker

+0

Ich fühle Sympathie für alle Java-Generika-Fragen ... – hbhakhra

Antwort

4

Sie vorschlagen :

ich denke, die folgende Alternative möglich war

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

Dies ist die richtige Lösung, obwohl ich normalerweise als (zur besseren Lesbarkeit) schreiben würde:

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

Du tippst RemoteControl auf ein Control Objekt, das auch auf einem Objekt, die extends View eingegeben wird. Daher müssen Sie die Implementierung View bereitstellen, die das Control-Objekt eingibt, das Ihr RemoteControl-Objekt eingibt.

Ich denke, Sie könnten Ihre Frage zu sagen, warum muss ich V - sollte es nicht aus der <C extends Control<V>> impliziert werden. Um die, die Antwort ist keine, benötigen Sie eine Art schaffen für V, um sicherzustellen, dass die richtige Art von Control vorgesehen ist (dh, dass es extends Control<V>)

Wenn Sie nicht egal, welche Art View das Control Objekt getippt schaltet ist, müssen Sie nicht Control im RemoteControl eingeben:

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

ist jedoch die Tatsache, Control getippt auf V extends View und RemoteControl implements Control<V>, sondern schlägt vor, dass Sie tun ...

Verwandte Themen