Java Generics und ungeprüfte Besetzung

8

Ich kämpfe mit diesem Aspekt von Generics in Java. Hoffentlich kann mir jemand helfen, die Wege zu sehen.

Ich habe eine Klasse, die eine Liste von Objekten enthält. Dieser Code funktioniert, aber ich möchte die Besetzung loswerden. Wie kann ich das generischer machen?

%Vor%     
Drew 18.12.2013, 15:09
quelle

2 Antworten

6

Im geposteten Snippet benötigen Sie den Cast, weil BaseRequest<? extends BaseObj> kein Subtyp von BaseRequest<BaseObj> ist und der Cast nicht zur Laufzeit überprüft werden kann, weil der Typ gelöscht wurde. Deshalb warnt der Compiler Sie. Aber wenn Sie die Deklaration von mRequests ändern:

%Vor%

Lassen Sie uns das Problem Schritt für Schritt lösen. Sie möchten

anrufen können %Vor%

wo ExtObj[1|2|3] extends BaseObj . Angesichts der List-Schnittstelle:

%Vor%

Wir müssen einen gemeinsamen Supertyp für BaseRequest<ExtObj1> , BaseRequest<ExtObj2> und BaseRequest<ExtObj3> finden. Ein Obertyp ist BaseRequest<?> und ein anderer ist BaseRequest<? extends BaseObj> . Ich habe die zweite ausgewählt, weil sie so restriktiv wie möglich ist. Sie sollten wissen, dass in Java BaseRequest<ExtObj1> kein Subtyp von BaseRequest<BaseObj> ist, da Generika invariant sind.

Jetzt, da wir die richtige Deklaration für mRequests haben, ist es einfach, die API für Executor.add() zu finden. Übrigens, wenn der von Ihnen benötigte Methodenkörper wirklich so einfach ist, brauchen Sie nicht einmal den Typparameter:

%Vor%     
Raffaele 18.12.2013, 15:19
quelle
0

Warnungen sind keine Fehler. Warnungen sind vorhanden, damit Sie überprüfen können, ob ein Fehler vorliegt, da dieser möglicherweise nicht automatisch überprüft wird. Sie sollten es überprüfen und dann mithilfe der Anmerkung feststellen, dass die Warnung bereits überprüft wurde.

In Ihrem Fall warnt es BaseRequest<T> ist nicht gleichbedeutend mit BaseRequest<BaseObj> .

Beispiel:

%Vor%

Sie können diesen Fehler unabhängig davon haben, wie Sie den angezeigten Code vervollständigen / integrieren.

    
aalku 18.12.2013 15:28
quelle

Tags und Links