Ich habe einen alten Kommandozeilenargument-Parsing-Code, den ich vor 4 Jahren für Java 5 geschrieben habe, und er wird nicht in Java 6 kompiliert, dank Änderungen in der Handhabung von Generics und / oder wenn bestimmte Bibliotheksklassen generisch sind . Beim Versuch, es zu beheben, stieß ich auf das folgende Problem; seit es 4 Jahre her ist, dass ich Java berührt habe und ich noch nie ein Experte für Generika war, stolpert es mich irgendwie.
Die Bibliothek ermöglicht es mir festzulegen, dass bestimmte Befehlszeilenoptionen enums entsprechen. Um dies zu tun, möchte das ArgumentSpecification-Objekt, das dieser Option entspricht, ein Klassenobjekt enthalten, das wir "enumClass" nennen und der enum-Klasse entsprechen. Leider kann ich nicht herausfinden, wie man den Typ dieses Feldes korrekt schreibt, um zu verhindern, dass es Klassenobjekte enthält, die tatsächlichen Enum-Klassen entsprechen. Ich denke, was ich will ist etwas wie:
%Vor%aber der Compiler stößt darauf an. Auf der anderen Seite ist der Compiler völlig zufrieden mit Methoden, die Rückgabewerte und / oder Parameter auf diese Weise haben:
%Vor%Ich kann stattdessen versuchen, dies für das Feld zu verwenden:
%Vor% aber das funktioniert auch nicht wirklich ... andere Teile des Codes brauchen den " <E extends Enum<E>>"
type", so dass sie tatsächlich bei E ankommen können, und dies scheint nicht mit dem "<? extends Enum<?>>"
, as übereinzustimmen Ich erhalte Compilerfehler wie folgt:
Gibt es eine Möglichkeit, das Feld mit dem richtigen Typ hier zu deklarieren, dass ich vermisse? Wenn ja, was ist das? Wenn nicht, ist es nicht schrecklich gebrochen von Java, um Typen in Methoden deklarieren zu können, die Sie nicht für Felder verwenden können? Oder bin ich so fürchterlich verwirrt, dass meine Frage keinen Sinn macht, damit anzufangen?
Wenn Sie ein Feld mit dem expliziten Parameter E
wie diesem definieren müssen, müssen Sie möglicherweise den Typ, in dem das Feld deklariert ist, parametrisieren. So etwas kompiliert:
Sie versuchen, ein "generisches Feld" zu deklarieren - eines, das selbst einen Typparameter hat. Es gibt kein solches Konzept in Java - nur Methoden und Typen können Typparameter einführen.
Wie Polygene Schmierstoffe sagen, können Sie einen zusätzlichen Typ-Parameter in den Typ selbst einführen und diesen als Typ des Feldes verwenden.