Frage

Ich versuche, ein Objekt zu meiner Action-Klasse zu werfen, aber es führt zu einer Warnung:

Type safety: Unchecked cast from Object to Action<ClientInterface>

Action<ClientInterface> action = null;
try {
 Object o = c.newInstance();
 if (o instanceof Action<?>) {
  action = (Action<ClientInterface>) o;
 } else {
  // TODO 2 Auto-generated catch block
  throw new InstantiationException();
 }
 [...]

Vielen Dank für jede Hilfe

War es hilfreich?

Lösung

Ja - das ist eine natürliche Folge der Typ Löschung . Wenn o ist eigentlich eine Instanz von Action<String>, die von den Darstellern nicht gefangen werden -. Sie werden nur das Problem, wenn Sie versuchen, es zu benutzen, vorbei in einem ClientInterface anstelle einer Zeichenfolge

Sie können von der Warnung loswerden mit:

@SuppressWarnings("unchecked")

als Funktion Anmerkung, aber man kann nicht einfach aussortieren das zugrunde liegende Problem: (

Andere Tipps

Wie üblich Jon Skeet richtig ist.

Um näher auf dem nicht-einfach Teil seiner Antwort:

Da

class ClientAction implements Action<ClientInterface> {}

Sie können schreiben:

Class<? extends Action<ClientInterface>> c = ClientAction.class;
Action<ClientInterface> action = c.newInstance();

Damit entfällt sowohl die Besetzung und die Warnung, um den Preis eine nicht-generische Art Einführung, so dass Sie .class verwenden können, ein ausreichend genau getippt Class Objekt zu erhalten.

Die Warnung bedeutet, dass die Compiler nicht Typsicherheit, auch wenn das Gießen Fein zur Laufzeit arbeitet garantieren können. Durch das Löschen, zur Laufzeit ist das Gießen einfach ein Casting zum Handeln. Es ist möglich, dass die zugrunde liegende generische Klasse nicht vom Typ ClientInterface ist wie erwartet. In diesem Fall erscheint das Problem später (vielleicht sogar viel später), als Classcast.

In diesem speziellen Fall empfehle ich diese spezielle Warnung durch das folgende Compiler-Direktive zu unterdrücken:

@SuppressWarnings("unchecked")

Kümmere dich nicht um. Es ist, weil der Java-Compiler hat keine Möglichkeit zu wissen, was der eigentliche Typ des Objekts ist.

Sie haben die Typinformationen verloren, weil der Löschung (das heißt, haben die parametrisierte Typen gelöscht worden ist), damit die Warnung. Sie können nicht etwas dagegen tun, außer aufzuräumen den umgebenden Code, so dass Generika häufiger verwendet werden, so dass Sie die generischen Typinformationen und vermeiden Gießen überhaupt passieren können.

Dies ist ein niedergeschlagene. Es ist die dynamische Umwandlung, wo der Compiler keine Ahnung von dem eigentlichen Objekt der Verweis auf zeigt.

Sie diese Warnung erhalten, weil die Zielart des gegossenen Action<ClientInterface> ist ein parametrisierte Typ und der Compiler kann nicht garantiert werden, dass das Objekt gegossen sein Typ ist vom gleichen Typ.

Wenn Sie diese Warnung nicht zu unterdrücken wollen und kümmern sich nicht um den Typ-Parameter, könnten Sie den Code dies ändern, indem Platzhalter verwenden:

Action<?> action = null;
try {
 Object o = c.newInstance();
 if (o instanceof Action<?>) {
  action = (Action<?>) o;
 } else {
  // TODO 2 Auto-generated catch block
  throw new InstantiationException();
 }
 [...]

Dies ist viel sicherer, weil der instanceof nicht, dass o ist ein Objekt von Action<ClientInterface> überprüfen, es zu überprüfen, ob o ein Objekt von Action ist, da ein weiteren generische Typinformationen sein werden gelöscht zur Laufzeit.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top