Was ist ein Anwendungsfall für einen generischen Konstruktor?

8

Betrachten Sie den folgenden Konstruktor für die Klasse Foo (was der Übersichtlichkeit halber nicht einer generischen Klasse ist):

%Vor%

Dies ist eine gültige Syntax für Konstruktoren, genau wie bei normalen generischen Methoden .

Aber was nützt diese Syntax? In der Regel bieten generische Methoden Typsicherheit für ihren Rückgabetyp und können vom Typrückschluss durch den Compiler profitieren. Zum Beispiel:

%Vor%

Aber ein Aufruf an einen Konstruktor gibt immer eine Instanz seiner deklarierenden Klasse zurück, so dass seine Typparameter keine Auswirkung auf den Rückgabetyp haben. Der obige Konstruktor könnte einfach durch seine Löschung ersetzt werden:

%Vor%

Natürlich geht es bei Generika nicht nur um die Typsicherheit für Rückgabetypen. Der Konstruktor möchte vielleicht nur die Art der übergebenen Argumente beschränken. Die obige Argumentation gilt jedoch immer noch für einen beschränkten Typparameter:

%Vor%

Sogar verschachtelte Typparameter mit Begrenzungen werden mit Platzhaltern behandelt:

%Vor%

Was ist also ein zulässiger Anwendungsfall für einen generischen Konstruktor?

    
Paul Bellora 22.02.2012, 23:03
quelle

5 Antworten

6

Hier ist ein mögliches, angepasst von der funktionalen Programmierung. Angenommen, wir haben einen Stream -Typ, der einen internen Status hat und wiederholt neue Elemente liefert, bis null zurückgegeben wird. Den externen Anrufern ist es egal, wie der interne Statustyp des Streamtyps aussieht. Sie könnten also etwas wie

erhalten %Vor%

ohne dass der Empfänger wissen muss, wie der interne Zustandstyp ist.

    
Louis Wasserman 22.02.2012, 23:11
quelle
5
___ qstntxt ___

Betrachten Sie den folgenden Konstruktor für die Klasse %code% (was der Übersichtlichkeit halber nicht einer generischen Klasse ist):

%Vor%

Dies ist eine gültige Syntax für Konstruktoren, genau wie bei normalen generischen Methoden .

Aber was nützt diese Syntax? In der Regel bieten generische Methoden Typsicherheit für ihren Rückgabetyp und können vom Typrückschluss durch den Compiler profitieren. Zum Beispiel:

%Vor%

Aber ein Aufruf an einen Konstruktor gibt immer eine Instanz seiner deklarierenden Klasse zurück, so dass seine Typparameter keine Auswirkung auf den Rückgabetyp haben. Der obige Konstruktor könnte einfach durch seine Löschung ersetzt werden:

%Vor%

Natürlich geht es bei Generika nicht nur um die Typsicherheit für Rückgabetypen. Der Konstruktor möchte vielleicht nur die Art der übergebenen Argumente beschränken. Die obige Argumentation gilt jedoch immer noch für einen beschränkten Typparameter:

%Vor%

Sogar verschachtelte Typparameter mit Begrenzungen werden mit Platzhaltern behandelt:

%Vor%

Was ist also ein zulässiger Anwendungsfall für einen generischen Konstruktor?

    
___ qstnhdr ___ Was ist ein Anwendungsfall für einen generischen Konstruktor? ___ answer9404705 ___

Ein Anwendungsfall, den ich mir vorstellen kann, ist, wenn Sie ein Konstruktorargument auf mehr als einen Typ beschränken wollen. Nur die generische Syntax erlaubt es Ihnen, einen Konstruktor zu deklarieren, der ein %code% von %code% s übernimmt, das auch %code% implementiert:

%Vor%     
___ 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. ___ answer9404731 ___

Sie können bestimmte Einschränkungen für die Konstruktorparameter erzwingen. Z.B. Der folgende Code erfordert zwei Parameter, die die Schnittstellen InterfaceA und InterfaceB implementieren.

%Vor%     
___ tag123constructor ___ Eine spezielle Art von Subroutine, die bei der Erstellung eines Objekts aufgerufen wird. ___ answer9404747 ___

Die Hauptanwendung besteht darin, sicherzustellen, dass Typeinschränkungen zwischen mehreren Parametern eingehalten werden. Hier ist ein Beispiel, das eine Reihe von Komponenten in der richtigen Reihenfolge auf einer Fertigungslinie platziert:

%Vor%

Hier stellt %code% sicher, dass %code% und %code% denselben Typ %code% und nicht (sagen wir), %code% und %code% enthalten.

    
___ tag123generics ___ Generika sind eine Form von parametrischer Polymorphie, die in einer Reihe von Sprachen gefunden wird, einschließlich .NET-Sprachen, Java und Swift. ___ answer9404726 ___

Hier ist ein mögliches, angepasst von der funktionalen Programmierung. Angenommen, wir haben einen %code% -Typ, der einen internen Status hat und wiederholt neue Elemente liefert, bis %code% zurückgegeben wird. Den externen Anrufern ist es egal, wie der interne Statustyp des Streamtyps aussieht. Sie könnten also etwas wie

erhalten %Vor%

ohne dass der Empfänger wissen muss, wie der interne Zustandstyp ist.

    
___
Steven Schlansker 22.02.2012 23:10
quelle
2

Ein Anwendungsfall, den ich mir vorstellen kann, ist, wenn Sie ein Konstruktorargument auf mehr als einen Typ beschränken wollen. Nur die generische Syntax erlaubt es Ihnen, einen Konstruktor zu deklarieren, der ein List von Number s übernimmt, das auch RandomAccess implementiert:

%Vor%     
Paul Bellora 22.02.2012 23:10
quelle
1

Sie können bestimmte Einschränkungen für die Konstruktorparameter erzwingen. Z.B. Der folgende Code erfordert zwei Parameter, die die Schnittstellen InterfaceA und InterfaceB implementieren.

%Vor%     
Thomas 22.02.2012 23:12
quelle
1

Die Hauptanwendung besteht darin, sicherzustellen, dass Typeinschränkungen zwischen mehreren Parametern eingehalten werden. Hier ist ein Beispiel, das eine Reihe von Komponenten in der richtigen Reihenfolge auf einer Fertigungslinie platziert:

%Vor%

Hier stellt <T> sicher, dass T[] und List<T> denselben Typ T und nicht (sagen wir), Integer[] und List<string> enthalten.

    
John Feminella 22.02.2012 23:14
quelle

Tags und Links