type-parameter

___ answer25378939 ___

Es gibt sehr wenige Situationen, in denen eine Grenze wie %code% notwendig ist. Die meiste Zeit schreiben die Leute das, die Grenze wird nicht wirklich im Code verwendet, und %code% würde genauso gut funktionieren.

Es gibt jedoch bestimmte Situationen, in denen die Grenze in %code% tatsächlich verwendet wird. Zum Beispiel:

%Vor%

Was Ihre Frage angeht - was ist mit %code% ? Nun, das erste Problem ist, dass Sie einen unformatierten Typ verwenden. Rohtypen sollten niemals in neuem Code verwendet werden. Aber Sie sind nicht überzeugt.

Der Rohtyp mit der obigen Klasse ( %code% ) wird mit einer Warnung kompiliert (die Sie auf Ihre eigene Gefahr ignorieren können). Der rohe Typ bedeutet jedoch, dass damit auch unsichere Dinge möglich sind.

Es bedarf einiger Anstrengungen, um ein Beispiel zu finden, um zu zeigen, dass es unsicher ist. Hier ist eins:

%Vor%

Der Code wird mit Warnungen, aber ohne Fehler kompiliert und löst zur Laufzeit ein %code% aus.

    
___ qstnhdr ___ Wann braucht es SomeE extends SomeE statt SomeE extends Some? ___ answer25380678 ___

Betreffend die Aussage

  

jedes Mal, wenn ich versucht habe, zusätzliche zu entfernen - keine neuen Fehler / Warnungen kamen auf.

Dies sollte nicht der Fall sein. Es sollte eine Warnung ausgegeben werden, weil Sie den rohen Typ %code% verwenden, und das Ergebnis ist fehlende Typsicherheit, wie im Antwort von newacct .

Das %code% / %code% Beispiel ist ein bisschen künstlich und etwas fehlerhaft. Sie haben vorgeschlagen, eine Klasse zu deklarieren

%Vor%

Aber hier bedeutet der Typparameter im Grunde: "Dieser Parameter ( %code% ) ist der Typ, mit dem Objekte dieser Klasse ( %code% ) mit" verglichen werden können. Sie sagen also ausdrücklich , dass ein %code% mit %code% vergleichbar sein sollte. Selbst mit anspruchsvollen Sprachen und intelligenten Compilern liegt es in der Verantwortung der Programmierer, Code zu schreiben, der Sinn macht.

Tatsächlich gibt es nicht viele Fälle, in denen diese selbstreferentiellen generischen Typen notwendig sind. Eines dieser Beispiele ist in diesem FAQ-Eintrag skizziert: Er deklariert eine Struktur von Knoten (d. H , ein Baum), wobei der type-Parameter verwendet werden kann, um die Definition der Struktur Struktur vom tatsächlichen Typ der Knoten zu entkoppeln:

%Vor%

Aber aus meiner persönlichen Erfahrung kann ich sagen, dass wenn Sie denken, dass Sie einen solchen Typ erstellen müssen, sollten Sie gründlich über die Vor- und Nachteile nachdenken. Letzteres bezieht sich hauptsächlich auf eine verringerte Lesbarkeit. Wenn Sie die Wahl zwischen Methoden wie

haben %Vor%

das sind typsicher, oder Methoden wie

%Vor%

die nicht typsicher sind (wegen roher Typen oder einfach weil die Typen nicht generisch sind), dann würde ich letztere bevorzugen. Code wird von Menschen gelesen.

    
___ tag123java ___ Java (nicht zu verwechseln mit JavaScript oder JScript oder JS) ist eine universelle objektorientierte Programmiersprache, die für die Verwendung in Verbindung mit der Java Virtual Machine (JVM) entwickelt wurde. "Java-Plattform" ist der Name für ein Computersystem, auf dem Tools zum Entwickeln und Ausführen von Java-Programmen installiert sind. Verwenden Sie dieses Tag für Fragen, die sich auf die Java-Programmiersprache oder Java-Plattform-Tools beziehen. ___ tag123generics ___ Generika sind eine Form von parametrischer Polymorphie, die in einer Reihe von Sprachen gefunden wird, einschließlich .NET-Sprachen, Java und Swift. ___ tag123recursion ___ Rekursion ist eine Art Funktionsaufruf, bei dem sich eine Funktion selbst aufruft. Solche Funktionen werden auch rekursive Funktionen genannt. Strukturelle Rekursion ist eine Methode zur Problemlösung, bei der die Lösung eines Problems von Lösungen für kleinere Instanzen des gleichen Problems abhängt. ___ tag123enums ___ Ein Datentyp, der aus einer Reihe benannter Werte besteht, die als Elemente, Member oder Enumeratoren des Typs bezeichnet werden. ___ answer25366632 ___

Es sieht aus wie zur Zeit hat %code% keinen Vorteil gegenüber %code%

Laut Artikel in Zusammenarbeit mit Java Champions und dem Ersteller von Java Generics FAQ :

Artikel gibt einige Möglichkeiten / Annahmen:

  • Da Enum eine generische Klasse ist, sollten wir sie immer nur in Verbindung mit einem Typ
  • verwenden
  • Java könnte strenger werden und rohe Typen könnten illegal werden
  

Ich denke, Enum wäre ausreichend gewesen.   Allerdings, wie Philip Wadler mich darauf hingewiesen hat, da Enum ein Generikum ist   Klasse, sollten wir es immer nur in Verbindung mit einem Typ verwenden. Im   Zukünftig könnte Java strenger und rohe Typen werden   illegal. Wir haben daher die Wahl, entweder %code% zu schreiben   oder %code% , von denen die erste Option mehr ist   genau. Auch wenn der Compiler mir momentan keine a zeigt   Unterschied, könnte ich in Zukunft Warnungen sehen, also folge ich diesem Idiom   meine Klasse auch

    
___ answer25373544 ___

Der Unterschied ist, dass %code% zwei Dinge bedeutet:

  • %code% ist ein Rohtyp. Kurz gesagt, bei Rohtypen werden alle generischen Informationen aus der Klasse entfernt, was wiederum zu unerwartetem Verhalten führen kann
  • %code% kann jede Klasse von %code% !
  • sein

Umgekehrt bedeutet die Verwendung von %code% :

  • %code% wird eingegeben
  • %code% muss die selbe -Klasse der Klasse sein, in der sie deklariert ist

Der rohe Teil ein Problem, aber die größere Implikation sind die Typgrenzen. Dieser Code demonstriert den Unterschied, wobei die "B" -Klassen die Klassen "A" als generischen Typ verwenden (oder versuchen, sie zu verwenden).

%Vor%

Klasse %code% kompiliert gut - der Typ von E ist nur an %code% gebunden, also any %code% Klasse, aber die Klasse %code% löst einen Kompilierungsfehler aus:

  

Typ Argument SomeTA ist nicht innerhalb der Grenzen der Typ-Variable E

Der Typ von %code% muss genau mit der enthaltenen Klasse übereinstimmen.

Dies ist wichtig, wenn Sie erwarten, dass Parameter und Rückgabetypen mit der Klasse identisch sind, was normalerweise bei typisierten Klassen der Fall ist.

Der Typ, der von einem unformatierten Typ begrenzt wird, ist weniger ein Problem, weil es immer noch ein %code% ist, aber es kann Fälle geben, in denen es einen Unterschied macht (ich kann mir gerade keinen vorstellen).

    
___ tag123Typeparameter ___ Ein Typparameter ist ein Parameter, dessen Wert ein Typ ist. ___ qstntxt ___

HINWEIS: Diese Frage ist nicht Enum-bezogen, so dass es nicht doppelt ist. Enum sind gezwungen, nur mit sich selbst zu vergleichen, weil Compiler Generierung von Typ Parameter, nicht, weil Java rekursive Typ Parameter / p>

Ich versuche einen Vorteil zu finden, um eine Klasse zu deklarieren als:

%Vor%

versus Erklärung als:

%Vor%

Ich habe versucht, Methoden bereitzustellen, die %code% zurückgeben, und Methoden, die %code% zurückgeben, verschiedene Querverweise in komplizierter Klassenhierarchie und jedes Mal, wenn ich versucht habe, zusätzliche %code% zu entfernen - keine neuen Fehler / Warnungen kamen hoch .

Können Sie mir eine Methode zeigen, die den Vorteil dieser zusätzlichen %code% beweist? Ich nehme an, dass es wegen JDK-Deklarationen einen gibt: %code%

Antworten auf andere Fragen zu SO gibt zum Beispiel:

  

Mit dem zusätzlichen Konstrukt wissen Sie, dass jede Klasse erweitert wird   Enum ist nur mit sich selbst vergleichbar.

Aber ich kann diese Theorie leicht brechen:

%Vor%

Trotz der generischen Rekursion kann ich immer noch Hund mit Katze vergleichen:

%Vor%

Transalting Theorie:

  

Sie wissen, dass jede Klasse, die Animal ausdehnt, nur mit sich selbst vergleichbar ist

das ist falsch - ich habe einen Klassenhund, der Tier mit Katze ausdehnt, nicht selbst.

    
___
1
Antwort

Scala type Parameter Grenzen

Ich habe Schwierigkeiten, scalas Typgrenzen zu verstehen. Was ich versuche, ist eine Halterklasse zu erstellen, die Elemente vom Typ T enthält, die über Elemente vom Typ A iterieren können. Was ich bisher habe, ist: %Vor% Die Klasse selbst k...
15.07.2011, 21:33
2
Antworten

Scala: Wie man eine Fallklassenkopie erstellt, bewahrt manifestierte Informationen auf

Eine Fallklassen copy() -Methode soll eine identische Kopie der Instanz erstellen und alle Felder nach Namen ersetzen. Dies scheint fehlzuschlagen, wenn die Fallklasse Typparameter mit Manifesten enthält. Die Kopie verliert alle Kenntnisse üb...
11.08.2012, 22:02
2
Antworten

Warum warnt mich VS, dass typeof (T) niemals der angegebene Typ in einer generischen Methode ist, bei der der Typparameter darauf beschränkt ist, T zu implementieren?

Ich hoffe, die Frage ist richtig, also lassen Sie uns ein Beispiel geben. Stellen Sie sich die folgende generische Methode vor: %Vor% Laut dem MSDN beschränkt das Schlüsselwort where den Typ-Parameter T auf vom Typ Base sein oder...
13.02.2013, 13:28
3
Antworten

Problem mit Java-Typparametern für Rückgabewerte

Ich habe versucht, dieses Problem auf die kleinste Menge an Code zu reduzieren, die ich konnte. Ich habe eine Tabellenstruktur wie eine Datenbanktabelle mit den Klassen Row und Table definiert. A Table ist im Wesentlichen eine Liste...
05.10.2016, 21:41
3
Antworten

Geschachtelte Typenparameter in Java

Dies ist ein Beispiel, das ich als Vereinfachung meines realen Codes erfunden habe, also entschuldige ich mich, wenn es ein wenig erfunden ist. Was ich tun möchte, ist, effektiv zwei Typparameter aus einem verschachtelten Argument zu bekommen. I...
08.11.2011, 23:27
2
Antworten

Sind nicht U, T U und T, U super T gleich?

Ich habe eine Verwirrung, wenn ich zwei Methodendeklarationen folge: %Vor% Sollten beide der oben genannten Bedingungen nicht gültig sein? Mit der Analogie von Wenn U Eltern von T ist, dann ist T Kind von U . Warum gibt der zweite einen Kom...
03.10.2012, 09:35
4
Antworten

Scala übergibt Parameter an Objekt

In Scala v 2.7.7 Ich habe eine Datei mit %Vor% Dies wirft den Fehler:    class Etwas nimmt Typparameter   Objekt Etwas erweitert OtherConstructor [Etwas] { Allerdings kann ich das nicht tun %Vor% Es löst einen Fehler aus:  ...
07.04.2010, 14:58
4
Antworten

Wann braucht es SomeE extends SomeE statt SomeE extends Some?

HINWEIS: Diese Frage ist nicht Enum-bezogen, so dass es nicht doppelt ist. Enum sind gezwungen, nur mit sich selbst zu vergleichen, weil Compiler Generierung von Typ Parameter, nicht, weil Java rekursive Typ Parameter / p> Ich versuche einen...
18.08.2014, 14:20