2016-06-02 10 views
-5

Könnten Sie mir bitte helfen, das generische Konzept hier zu verstehen.Generisches Erasure-Konzept

// Can't create an instance of T. 
class Gen<T> { 
    T ob; 

    Gen() { 
    ob = new T(); // Illegal!!! 
    } 

    public static void main() { 

    Gen<Integer> genobj = new Gen<Integer>(); //Error 
    } 
} 

Wenn Ihr Java-Code kompiliert wird, werden alle generischen Typ Informationen entfernt (gelöscht). Dies bedeutet, dass Typparameter durch ihren gebundenen Typ ersetzt werden, der Object ist, wenn keine explizite Bindung angegeben ist, und dann die entsprechenden Umwandlungen (wie von den Typargumenten bestimmt), um die Typkompatibilität mit den durch die Typargumente angegebenen Typen beizubehalten. Der Compiler erzwingt auch diese Typkompatibilität.

Meine Frage: -Warum Java Compier ist Fehler hier werfen? Bevause nach complitaion.

Dank

+0

Nach der Kompilierung wird der Typ "T" gelöscht, so dass das Programm nicht weiß, welchen Typ Sie versuchen zu instanziieren. – khelwood

+0

Bitte korrigieren Sie mich, wenn ich falsch liege.'T 'wird ersetzt mit Java.lang.Object – alakhya

+0

Gen genobj = neue Gen () nach der Kompilierung wäre es Gen genobj = neues Gen () – alakhya

Antwort

3

Es gibt ein paar Möglichkeiten, die hier trainieren kann:

Aus logischer POV:
ist es nicht einmal gewährleistet, dass unabhängig von Template-Parameter T Sie verwenden einen Standard-Konstruktor hat. Das bietet offensichtlich das Problem, wie man mit dem Fehlen eines Standardkonstruktors umgehen kann. Mögliche Lösungen wären, einen Laufzeitfehler, Kompilierungsfehler zu erzeugen oder alle T zu verbieten, die keinen Standardkonstruktor zur Verfügung stellen. Letzteres würde offensichtlich die Template-Definition durchbrechen, die beliebigeT erlaubt. Und der Laufzeitfehler würde die Dinge ziemlich komplizieren und das gleiche Problem wie oben erwähnt ergeben. Bleibt dieses Verhalten an erster Stelle und verursacht einen Kompilierungsfehler.

Aus einer internen Sicht:
Nehmen wir an, wir könnten den bereitgestellten Code verwenden. Wie würde es dann funktionieren? Aufgrund der Löschung würde new T() eine Object erzeugen. Aber was ist, wenn TInteger ist? Nun, wir sind verrückt. Eine Object ist keine Integer, daher erhalten wir eine einfache Klassenausnahme.

Also zusammenfassend: die oben genannten zu kompilieren würde nicht funktionieren von einem praktischen POV und zusätzlich brechen die aktuelle Definition von Generika in Java.