Java generische Feld Erklärung
In eine Klasse ohne generische Typen möchte ich erklären, eine eher komplexe generische Feld ähnlich wie diese:
public class Client {
private Map<Class<T extends Serializable>, List<Consumer<S extends T>>> classToConsumerTry1;
private <T extends Serializable, S extends T> Map<Class<T>, List<Consumer<S>>> classToConsumerTry2;
}
promblem ist der java-compiler lässt mich nicht 🙂
Also meine Frage ist wie kann ich richtig einführen, T und S, ohne Zugabe von Typen in meine Klasse Client.
Mein Ziel ist es, die Durchsetzung der Class
ein Subtyp von Serializable
und die Consumer
als ein Subtyp der Klasse, die Sie gewählt haben Class
.
- Warum wollen Sie nicht erweitern Sie Ihre Klasse Erklärung?
- Weil mein
Map
sollten in der Lage sein, die verschiedene Werte für T und S nicht nur diejenigen definiert, die in derClient
Erklärung. - Wo sind Ihre Anzeigen Mitgliedern initialisiert? In einem Konstruktor? In einigen setter-Methode?
- Ich weiß nicht wirklich verstehen, Ihre Anforderung - es ist Java-Vorstellung, dass Sie generische Feld-Typen, die auf die Objekterstellung, - was wollen Sie erreichen?
- Im Empfang Serializables über ein Socket und verarbeiten möchten Sie schön wie diese:
classToConsumer.get(serial.getClass()).get(i).accept(serial);
- Neben den Antworten, die behaupten, Sie können nicht eine Allgemeine Feld in eine nicht-generische Klasse
S extends T
ist illegal und wird nicht kompiliert. Und es macht keinen Sinn, entweder. Warum würden Sie wollen, eineConsumer
etwas erweitert, etwas erweitertSerializable
? Verwenden Sie einfachT
für Ihre Verbraucher und Sie werden getan werden.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie nicht. Ihre einzige option ist es zu erklären, dass die generischen Typ-Parameter in Ihrem
Client
Klasse Erklärung. Wenn IhrClient
Klasse hat keinen generischen Typ-Parameter, Ihre Mitglieder können nicht generisch sein. Sie verwenden müssen die tatsächliche Typen in der Deklaration der Klasse Mitglieder.Müssen Sie irgendwo einzuführen, die Typ-parameter, so dass Sie Sie verwenden können in der definition für die Klasse Mitglieder.
Einführung einer Typ-parameter kann nur auf Klassen-Ebene, oder auf eine Methode-Ebene. In Ihrem Fall, es sollte auf class-level:
Dies impliziert jedoch, dass sowohl für Mitglieder (
classToConsumerTry1
undclassToConsumerTry2
),T
undS
sind die gleichen. Wenn Sie wollen, dass Sie, anders zu sein, die Sie haben, um diese zwei Werte aus zwei verschiedenen Klassen, beide sind parametrisiert mit separaten Typ-Parameter.protected class ClientImpl
zu verstecken Generika, eine exponiertepublic class Client extends ClientImpl<Serializable, Serializable>
deklariert werden kannKönnen Sie nicht direkt auf dem Feld, aber Sie kann pflegen Sie Ihre Arten der Politik, die durch generische Methoden (Sie können auch in nicht-generischen Klasse):
Können Sie nicht die Weise, die Sie wollen, es zu tun. Sie können aber als
Object
und gegossen. Andere hacky-Antworten umfassen die Verwendung einesList
von<? extends Serializable>
(aber das funktioniert nur für einenextends
) und dannadd()
Ihren Artikel oder eine interne Klasse, die so etwas macht wie:so können Sie den Zugang/mutieren
obj
intern.