1) Warum obj4, obj6, obj7 kompilieren Fehler, und obj5 ist in Ordnung? Wo kann ich über Regeln lesen, die die Verwendung solcher generischer gekoppelter Außen-Innen-Klassen regeln? Ich habe nichts direkt auf den Punkt gebracht.Welche Regeln gelten, um Instanzen der generischen äußeren Klasse und ihrer inneren generischen inneren Klasse zu instanziieren und entsprechende Referenzen zu deklarieren?
Wenn ich kein Typ-Argument für Inner-Klasse in Obj3 liefern, ist es in Ordnung (während Inner-Klasse etwas für sein Fld3-Feld vom Typ S gegeben werden muss), aber wenn ich das gleiche mache und nicht liefern Typ für die äußere Klasse - es kompiliert nicht (obj4) - obwohl das Objekt impliziert werden könnte ...
2) Außerdem, warum obj10 kompiliert gut, aber obj11 fehlschlägt? In obj10 Zeile schreibe ich auch outerInstance.new Inner <>(), was für Inner bedeutet, dass S Objekt ist. Aber das ist nicht Problem für die innere, sondern gleichen "Trick" ist Problem für Outer ...
//in Class A of package com.sth
public class MyGen<T> {
T fld1;
class GenInner<S> {
T fld2;
S fld3;
}
// within main of Class Driver of same package com.sth
MyGen.GenInner obj1 = new MyGen<String>().new GenInner<Integer>();
MyGen.GenInner obj2 = new MyGen<String>().new GenInner<>();
MyGen.GenInner obj3 = new MyGen<String>().new GenInner();
//MyGen.GenInner obj4 = new MyGen().new GenInner<String>(); //ERR !
MyGen.GenInner obj5 = new MyGen<>().new GenInner<String>();
//MyGen<String>.GenInner obj6; // ERR
//MyGen.GenInner<String> obj7; // ERR
MyGen<String>.GenInner<Integer> obj8;
MyGen.GenInner obj9;
MyGen<String>.GenInner<Integer> obj10 = new MyGen<String>().new GenInner<>();
//Type mismatch: cannot convert from MyGen<Object>.GenInner<Integer> to MyGen<String>.GenInner<Integer>
//MyGen<String>.GenInner<Integer> obj11 = new MyGen<>().new GenInner<Integer>(); // ERR!
Diese Antworten auf meine Frage beziehen, aber geben keine Ahnung:
Java 8 lehnt auch 'obj3' ab:" falsch formatierter Typ, einige Parameter fehlen ". –
seltsam, aber mein Eclipse-Compiler für Java SE8 kompiliert obj3 Zeile fein, und kein Problem in Runtime! P.S .: MyGen.GenInner obj3 = new MyGen() .new GenInner(); –
LrnBoy
Ich denke, ich sollte genauer sein: Der Compiler von OpenJDK 8 lehnt den Klasseninstanz-Ausdruck ab, der 'obj3' zugewiesen ist. OpenJDK ist auch die Basis des JDK von Oracle, daher hat das eine große Bedeutung. Ich bin nicht der Meinung, dass es richtig ist, es abzulehnen, trotz der ausgezeichneten Antwort von @ Radiodef, aber ich bin sicher, dass es unklug ist, einen solchen Code zu schreiben. Mit wenigen Ausnahmen sollte neuer Code keine unformatierten Typen verwenden (und auch keine seltenen verwenden). –