Java-Methoden und Generika

8

Warum werden Generika als Teil einer Methode deklariert? Wenn Sie beispielsweise eine Methode erstellen, die Generika verwendet, müssen die Generika nach den Methodenmodifikatoren eingefügt werden:

%Vor%

Der Generikenteil einer Methode wird nicht als Teil einer Methodendeklaration angezeigt. Laut Java-Dokumentation enthalten Methoden die folgenden Elemente:

  

Modifikatoren wie öffentlich, privat und andere werden Sie später kennen lernen.

     

Der Rückgabetyp - der Datentyp des von der Methode zurückgegebenen Werts oder void, wenn die Methode keinen Wert zurückgibt.

     

Der Methodenname - die Regeln für Feldnamen gelten auch für Methodennamen, aber die Konvention ist etwas anders.

     

Die Parameterliste in Klammern - eine durch Kommas getrennte Liste von Eingabeparametern, denen ihre Datentypen vorangestellt sind (in Klammern eingeschlossen) (). Wenn keine Parameter vorhanden sind, müssen Sie leere Klammern verwenden.

Referenz: Ссылка

    
mattfred 31.07.2015, 17:32
quelle

4 Antworten

9

Dies liegt daran, dass Sie die generischen Typparameter declaration und usage separat betrachten müssen.

In einer Methodendeklaration ohne das erste <T,K> , wie folgt:

%Vor%

Der Compiler würde nicht wissen, dass T und K Parameter des Methodentyps sein sollen (abgeleitet vom Methodenaufruf). Es würde erwarten, dass T und K bereits deklariert (z. B. importiert) werden, weil dies Verwendungen von Generika sind, keine Deklarationen.

Deshalb brauchen Sie nach den Modifizierern für den Compiler die Deklaration <T, K> , indem Sie angeben, dass T und K vom Methodenaufruf abgeleitete Typparameter sind.

Das Problem tritt nicht auf, wenn Sie eine generische Klasse wie folgt deklarieren:

%Vor%

weil es keine andere Bedeutung gibt, die T hier haben könnte, das kann nur ein Typparameter Deklaration sein.

Hinweis: Sie können auch den Unterschied zwischen Deklarationen und Verwendungen feststellen, da Sie einen Typparameter während seiner Deklaration einschränken können, aber nicht während seiner Verwendung. Dies ist gültig:

%Vor%

Während dies nicht ist:

%Vor%

Warum ist der Compiler nicht intelligenter?

Sie könnten mir sagen, dass der Compiler schlau sein könnte, und er könnte sehen, dass der Typ nicht deklariert ist, und folgern, dass er generisch sein soll. Aber es wäre wirklich ein Durcheinander, wenn es so wäre.

In den meisten Fällen ist Ihre Methode nicht generisch. In den meisten Fällen wird ein Parameter wie List<Something> verwendet, wobei Something bereits definiert ist. Stellen Sie sich vor, Sie vergessen einfach, die Klasse Something zu importieren ...

Der Compiler würde einen generischen Typparameter annehmen, gelöscht nach Objekt, und Sie würden nicht verstehen, warum Sie die Methoden Ihrer Klasse nicht benutzen können. Es würde einige Zeit brauchen, um zu erkennen, was falsch ist, weil der Compiler das akzeptieren würde eine Erklärung.

    
Joffrey 31.07.2015, 17:38
quelle
2

Für eine zuverlässigere und vollständigere Quelle der Dokumentation sollten Sie auf die Java-Sprachspezifikation zurückgreifen. Speziell in diesem Fall Abschnitt 8.4 zu Methodendeklarationen wo sie erwähnen explizit Typparameter:

  

Eine Methode deklariert ausführbaren Code, der aufgerufen werden kann und eine feste Anzahl von Werten als Argumente übergibt.

     

MethodDeclaration:

     
    

{MethodModifier} MethodHeader MethodBody

  
     

MethodHeader:

     
    

Result MethodDeclarator [Throws]

         

TypeParameters {Annotation} Result MethodDeclarator [Throws]

  
     

MethodDeclarator:

     
    

Identifier ( [FormalParameterList] ) [Dims]

  
    
manouti 31.07.2015 17:39
quelle
1

Von Ссылка "Wir müssen den spezifischen Typ String in der Definition der Methode durch den ersetzen Name eines Typparameters, wie zB T. Wenn dies jedoch die einzige Änderung ist, die wir machen, wird der Compiler denken, dass "T" der Name eines tatsächlichen Typs ist, und er wird ihn als nicht deklarierten Bezeichner markieren. Wir brauchen einen Weg dem Compiler mitzuteilen, dass "T" ein Typparameter ist. Das ist, was das & lt; T & gt; in der Definition der generischen Klasse "class Queue & lt; T & gt; {... ". Für eine generische Methode geht das & lt; T & gt; unmittelbar vor dem Namen des Rückgabetyps der Methode" Also, die & lt; T & gt; bevor der Methodenname dem Compiler mitteilt, dass das T in der Methodensignatur kein tatsächlicher Typ ist, sondern ein generischer.

    
Lee 31.07.2015 18:13
quelle
0

Generics ist nur eine Abkürzung für "generische Typen", die für Rückgabetypen oder für Parametertypen (wie in Ihrem Fall: AbstractDao<T, K> ) ausgedrückt werden können. Und die Syntax der Sprache erfordert, dass die in den generischen Typen angegebenen Typvariablen vor als Rückgabetyp der Methode deklariert sein müssen, damit sie sowohl Rückgabe- als auch Parametertypen umfassen können.

>     
Renzo 31.07.2015 17:37
quelle

Tags und Links