Datentypen Zuweisungsproblem bei parametrisierten Typen mit/ohne Wildcards

Fish

Mitglied
Hallo zusammen,

ich habe ein kleines aber unschönes Problem mit der Zuweisung von parametrisierten Typen. Nehmen wir einmal an, ich hätte drei Interfaces:

Java:
interface Result {  }

interface Action<R extends Result> { }

interface ActionHandler<A extends Action<R>, R extends Result> { 
    R execute(A action);
}

Ein gegebenes Action Object verknüpfe ich über eine Annotation mit ihrem ActionHandler; seine einzige Methode gibt die Klasse des benötigten ActionHandlers zurück. Ich muss hier natürlich Wildcards verwenden, weil Annotationen ja nicht parametrisiert werden können!
Java:
@interface HandledBy {
     Class<? extends ActionHandler<? extends Action<? extends Result>, ? extends Result>> value();
}

Nicht perfekt (ich könnte zwei verschiedene Result-Objekte verwenden), aber soweit, so gut.

Merkwürdig wird es dann, wenn ich versuche, einen ActionHandler auszuführen. Dazu verwende ich folgende Methode, die in einer Klasse Dispatcher untergebracht ist; die Klasse selbst spielt keine Rolle.
Java:
public class Dispatcher {
      public <A extends Action<R>, R extends Result> R execute(A action) {
		// liest die Annotation von der Action aus, die uns verrät, mit welchem ActionHandler wir sie ausführen müssen!
		HandledBy handledBy = action.getClass().getAnnotation(HandledBy.class);

		R result = null;

		try {
			// Instanz des speziellen ActionHandlers erstellen
			ActionHandler<A, R> handler = handledBy.value().newInstance();

			// die Action mit ihrem eigenen ActionHandler ausführen und das Ergebnis einkassieren!
			result = handler.execute(action);		
		} // catch clauses omitted for brevity


		return result;
	}
}

Bei der Zuweisung im try Block bekomme ich dann eine Fehlermeldung die mir erzählt, die beiden Typen wären nicht kompatibel. Liegt dass daran, dass der Typ, der aus der Annotation kommt, Erasures enthält? Oder liegt es an etwas ganz anderem?

Über eure Hilfe würde ich mich sehr freuen!

Einen schönen Abend noch,
Goldi
 

Marco13

Top Contributor
Was da aus der Annotation kommt enthält "irgendwelche" Typen. Das gleiche Problem tritt ja schon bei vieeel einfacheren Strukturen auf:
Java:
import java.util.*;

public class Dispatcher
{
    private List<? extends Number> getList() { return null; }

    private void method()
    {
        List<Float> list = getList();
    }
}

Man bekommt bei getList "irgendeine" List, die zwar Numbers enthält, aber man weiß nicht ob dort Integers oder (wie benötigt) Floats drin sind.

Es gibt da einige mehr oder weniger schöne ... "Workarunds", um das Problem abzuschwächen oder ggf. ganz zu lösen, aber das ist in diesem Fall schwierig, weil das Beispiel erstens ziemlich verschachtelt ist, und zweitens die Typinformation AFAIK nicht so ohne weiteres durch die Annotation geschleift werden kann. Vielleicht könnte man das lösen, indem man der Annotation noch Parameter (Class-Objekte) mitgibt, aber da müßte ich auch erst genauer schauen.
 

Fish

Mitglied
Lieber Marco,

vielen Dank zunächst für deine Hilfe! Deinem Einwand kann ich allerdings nicht ganz folgen:
Was da aus der Annotation kommt enthält "irgendwelche" Typen. [...] Vielleicht könnte man das lösen, indem man der Annotation noch Parameter (Class-Objekte) mitgibt, aber da müßte ich auch erst genauer schauen.

Ich bekomme doch aus der Annotation nicht irgendwelche Typen, sondern nur solche, die ActionHandler implementieren; der Parameter value() enthält ja genau diese Information, und ich bekomme auch einen Kompilerfehler, wenn ich der Annotation zum Beispiel einen String übergebe. Der einzige Unterschied ist lediglich, dass ich die Typendefinition einmal mit einer Generischen Variable "A" und einmal mit einer Wildcard deklariere. Ich dachte ja ursprünglich, dass es an der Vermengung der Typen läge, aber folgende Deklaration kompiliert:

Java:
List<? extends Number> list = new ArrayList<Long>();

Was habe ich übersehen?

Viele Grüße,
Goldi

Edit: Ich habe eine erste einfache Lösung gefunden (ist eigentlich schon peinlich):
[java=10]
handler = (ActionHandler<A, R>) handledBy.value().newInstance();
[/code]
Mit der erzwungenen Typenumwandlung kompiliert der Code einwandfrei und lässt sich auch korrekt ausführen! Ich wüsste allerdings trotzdem gerne, warum diese Umwandlung überhaupt nötig ist...
 
Zuletzt bearbeitet:
S

SlaterB

Gast
ich weiß nicht genau worum es dir geht, aber hier mal etwas was kompiliert
Java:
interface HandledBy {
    <A extends Action<R>, R extends Result>Class<ActionHandler<A, R>> value();
}
class Dispatcher {
    public <A extends Action<R>, R extends Result> R execute(A action) {
      HandledBy handledBy = null;
      R result = null;
      try {
          // Instanz des speziellen ActionHandlers erstellen
          Class<ActionHandler<A, R>> c = handledBy.value();
          ActionHandler<A, R> handler = c.newInstance();

          // die Action mit ihrem eigenen ActionHandler ausführen und das Ergebnis einkassieren!
          result = handler.execute(action);       
      }  catch (Exception e) {}
      return result;
  }
}
Zeile 10 + 11 kann man allerdings auch hier nicht zusammen schreiben

edit:
niemals generische Parameter casten, (ActionHandler) statt (ActionHandler<A, R>) macht exakt dasselbe
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
X Zuweisungsproblem bei einer Schleife Java Basics - Anfänger-Themen 4
C Parameter in verschiedenen Anzahl und Typen Java Basics - Anfänger-Themen 6
Henri Problem von Typen Java Basics - Anfänger-Themen 7
B Generische Typen für dynamisches Formular Java Basics - Anfänger-Themen 3
A Literale für primitive Daten Typen Java Basics - Anfänger-Themen 4
N Enum Typen, was passiert intern mit ihnen? Java Basics - Anfänger-Themen 2
O Generische Typen Java Basics - Anfänger-Themen 9
L Abstrakte Typen und Schnittstellen Java Basics - Anfänger-Themen 19
BadBat Variablen Eine Variable mit 2 Typen Java Basics - Anfänger-Themen 38
D Generische Typen Java Basics - Anfänger-Themen 20
P Liste sortieren verschiedener generischer Typen Java Basics - Anfänger-Themen 4
T Interface implementieren mit Abstrakten Typen? Java Basics - Anfänger-Themen 4
K Datentypen Kurzform Addition geht, Langform scheitert am Typen Java Basics - Anfänger-Themen 6
K Frage zu Referenzvariablen und deren Typen Java Basics - Anfänger-Themen 6
C Typen aus List<Object[]> ändern Java Basics - Anfänger-Themen 7
D Klassen Feste und veränderbare Typen in Hierarchien Java Basics - Anfänger-Themen 5
B Elementare Typen und Referenztypen Java Basics - Anfänger-Themen 6
S Collections Aus Set<Object> bestimmte Typen entfernen Java Basics - Anfänger-Themen 3
B dynamische/statische Typen Java Basics - Anfänger-Themen 2
H Felder mit unterschiedl. Typen sortieren Java Basics - Anfänger-Themen 5
T genericsdeklaration - Typen einschränken Java Basics - Anfänger-Themen 17
C unterschied generische typen und supertypen als methodenparameter Java Basics - Anfänger-Themen 3
alderwaran überladene methoden mit allen möglichen typen aufrufen Java Basics - Anfänger-Themen 3
X eigener Mergesort auf generischen Typen mit Comparator Java Basics - Anfänger-Themen 6
D Datentypen mehrdimensionales Array meherer Typen möglich ? Java Basics - Anfänger-Themen 6
R Array eines neuen Typen erstellen und befüllen Java Basics - Anfänger-Themen 2
F Generische Typen auch für statische Methoden? Java Basics - Anfänger-Themen 13
B instanceof Prüfung für generische Typen Java Basics - Anfänger-Themen 5
T mit Typen Date rechnen Java Basics - Anfänger-Themen 6
G Mehrere Typen in einer Datei Java Basics - Anfänger-Themen 5
T Vergleich von generischen Typen Java Basics - Anfänger-Themen 2
M List mit typen füllen Java Basics - Anfänger-Themen 5
J Datei aus unterschiedlichen Typen auslesen Java Basics - Anfänger-Themen 6
G Problem mit Variablen-Typen Java Basics - Anfänger-Themen 3
L 2 verschiedene Typen in einer Tabelle ablegen Java Basics - Anfänger-Themen 18
W Typen Angaben bei Java 1.5 Java Basics - Anfänger-Themen 8
T Rückgabewerte verschiedener Typen Java Basics - Anfänger-Themen 3
A Array mit generischen Typen casten? Java Basics - Anfänger-Themen 6
C Globale Variablen und Array mit verschiedenen Typen Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben