Ich stieß auf ein Problem, für das ich keine Lösung finden konnte.Generics Wildcard ist nicht in der Lage, nach Genericetype zu konvertieren
Ich verwende oft eine Zuordnung, wo der Schlüssel und der Wert Objekte mit übereinstimmenden generischen Typen sind. Für jedes Paar sollten die Generika übereinstimmen. Obwohl die generischen Typen zwischen den Einträgen variieren können. (Ich nehme ein Beispiel zur Klarheit). Dies kann leicht mit der Verwendung der WildCard erreicht werden. Aus diesem Grund können Sie den Schlüssel oder Wert nicht in Kombination miteinander verwenden.
Betrachten Sie das Beispiel an der Unterseite. Es gibt keine (einfache) Möglichkeit, die Map so zu modifizieren, dass Cast-Exceptions ausgeführt werden. Obwohl ich immer noch nicht in der Lage sein werde, die Karte so zu benutzen, wie ich es innerhalb useEntries()
versucht habe. Meine Frage ist also, gibt es einen Workaround dafür? Danke im Voraus!
public class GenericWildcardTest
{
static Map<GenericObject<?>, Function<?, ?>> map = new HashMap<>();
public static <S> void put(GenericObject<S> genericObject, Function<S, S> function)
{
map.put(genericObject, function);
}
public static void useEntries()
{
for(Entry<GenericObject<?>, Function<?, ?>> currentEntry : map.entrySet())
//The #apply(); part simply wont compile because of cast errors.
currentEntry.getKey().set(currentEntry.getValue().apply(currentEntry.getKey().get()));
}
// Simple Object with generic.
static class GenericObject<T>
{
private T object;
public GenericObject(T object)
{
this.object = object;
}
public void set(T object)
{
this.object = object;
}
public T get()
{
return this.object;
}
}
}
Casting ist eine offensichtliche Problemumgehung. – shmosel
Ich bin verwirrt von Ihrem Beitrag und was Sie fragen. Sie verwenden Generics und Wild Cards. Ich empfehle, dieses Tutorial vollständig durchzugehen, es deckt Generics und Wildcards ab und wird Ihre Probleme beleuchten. [Die Java ™ Tutorials: Generics (Aktualisiert)] (http://docs.oracle.com/javase/tutorial/java/generics/index.html) – Underbalanced
@shmosel hast du wahrscheinlich gar nicht versucht, dies zu tun? da es nicht funktioniert. Ich habe sogar versucht, eine private Methode mit einer eigenen generischen Implementierung zu erstellen. aber es ist ziemlich einfach. ein generictype kann zu einem Platzhalter, aber nicht vicaversa – n247s