2013-07-05 11 views
5

Ich habe eine Klasse mit einem beschränkten Typ-Parameter mit verschachtelten Wildcard Typen begrenzt. In der Klasse muss ich die Typen der gebundenen verschachtelten Parameter in mehreren Methoden verwenden. Gibt es eine Möglichkeit, den beschränkten Wildcards-Typ stattdessen als generischen Typparameter zu definieren oder ihn einem allgemeinen Variablennamen zuzuweisen, sodass er leicht an mehreren Stellen referenziert werden kann?Java verschachtelte Platzhalter gebunden Typen mehrere Male oder als generische Typparameter

Die Art und Weise die Klasse nun umgesetzt wird, ist wie

class AbstractManager<F extends Filter<? extends Criteria<? extends Type>>> 
    { 
     protected void setFilter(F filter) 
     { 
     setCriteria(f.getCriteria()); 
     } 

     protected <T extends Criteria<? extends Type>> void setCriteria(List<T> criteria) 
     { 
     } 

     protected <T extends Criteria<? extends Type>> void doSomethingWithCriteria(List<T> criteria) 
     { 
      ... 
     } 
    } 

, die nicht wirklich die Art der Liste auf die Art des Filters gebunden schränkt aber gut genug, um in unserer Situation. Idealerweise wäre der Typ der Liste auf den Typ des Filters beschränkt, der ein Konstrukt verwendet, das den abgeleiteten Typ des Filters an einen Namen binden könnte, der einem Parameter des beschränkten Typs auf einer Methode ähnelt, aber stattdessen auf Klassenebene.

Grundsätzlich würde ich so etwas wie

class <G extends Criteria<? extends Type> AbstractManager<F extends Filter<G>> 

Von tun, was ich weiß und finden kann, ist dies nicht möglich ist, aber ich hatte gehofft, dass vielleicht war es eine obskure Feature oder eine neue Funktion in Java 7 auf, würde dies möglich machen. Ich weiß, es ist möglich, einen zweiten Typ Parameter wie

class AbstractManager<F extends Filter<G>, G extends Criteria<? extends Type>> 

angeben, aber ich möchte nicht, dass die Kind-Klassen G müssen angeben, wenn der Compiler es bestimmen kann.

Die einzig mögliche Option/Lösung Ich finde der Lage gewesen ist, eine flache Unterklasse mit Factory-Methoden in der solution Nested Type Parameters in Java und in Java generics - use same wildcard multiple times

+0

können Sie ein Beispiel, was Endergebnis Sie wünschen? –

Antwort

1

Wenn ich auf diese Frage gegeben haben, verstehen, was Sie wollen tu, es würde die Semantik deiner Klasse ändern. Gerade jetzt in der aktuellen Klasse, Sie zum Beispiel haben könnte:

class T1 extends Type {} 
class T2 extends Type {} 
class C1 extends Criteria<T1> {} 
class C2 extends Criteria<T2> {} 
class C3 extends Criteria<T2> {} 
class F1 extends Filter<C1> {} 
class Manager extends AbstractManager<F1> {} 

Und dann, obwohl Manager auf F1 basiert, würden einige Benutzercode vollkommen legal sein, wenn es tut:

Manager m = new Manager(); 
C2 c2 = new C2(); 
C3 c3 = new C3(); 
m.setCriteria(Arrays.asList(new C2[]{c2}); 
m.doSomethingWithCriteria(Arrays.asList(new C3[]{c3}); 

Ich weiß nicht, ob es deine Absicht war, aber es ist legal (aus Kompilersicht). Wenn Sie diesen Platzhalter jedoch irgendwie benennen könnten, würden Sie den Benutzer Ihrer Klasse durch die Verwendung dieses Namens in Ihren Methoden dazu zwingen, denselben Typ in allen Methoden zu verwenden. Mit anderen Worten, in meinem Beispiel müssten die Methoden mit Listen von C1 aufgerufen werden.

Als Schlussfolgerung, wenn Sie die Flexibilität, die Ihr Beispiel hat wollen, müssen Sie den Platzhalter wiederholen; aber wenn Sie eine Einschränkung möchten, dass die Methoden die gleichen Kriterien wie der Filter der Manager verwenden, dann gab man tatsächlich die Lösung:

class AbstractManager<F extends Filter<G>, G extends Criteria<? extends Type>> 

(oder einen eigenen Untertyp erstellen, die sich wiederholende zu vermeiden, wie Sie erwähnt (alles, was Sie nicht mit mir gefallen?))

+0

Sie haben recht, die aktuelle Implementierung erlaubt verschiedene Typen in setCriteria/doSomethingWithCriteria als was im Filter definiert ist, daher das Problem und die Notwendigkeit für ein anderes Konstrukt/Mechanismus wie die Benennung der Einschränkung auf Klassenebene wie 'class 'oder was ist nicht ideal gelöst mit der Lösung eines zweiten Parameters. Ich hätte das in der Frage deutlicher machen sollen. – bdrx

+0

OK, dann denke ich, die kurze Antwort auf deine Frage ist leider: "Nein" ... und du hast Recht, ein weniger wortreicher Mechanismus wäre nett. Ich denke, der Beste wäre in der Lage, die Wildcard auch innerhalb der Beschreibung zu benennen. Zum Beispiel: 'Klasse AbstractManager >' mit der Fähigkeit, 'F',' C' und 'T' überall in der Klasse zu verwenden. Du kannst es der Community für Java 9 immer vorschlagen :) – Djizeus