Generische Map Frage

JCODA

Top Contributor
Hallo liebes Forum,

ich versuche mich gerade ein bisschen am MVC-Pattern und bin jetzt auf ne Frage gestoßen und zwar:

Java:
public interface View<T> {	
	public void render(T t);	
}

Java:
public class Bomb extends RotatedEntity{...}

Java:
public class BombView implements View<Bomb>{...}

Nun hätte ich gerne eine Map, bei der ich folgendes schreiben kann:
Java:
map.put(Bomb.class, new BombView());

also eine "Art"
Java:
Map<Class X><? extends View<Class X>>

dies funktioniert leider nicht. Hätte jemand einen anderen Vorschlag? (bzw. die richtige "Kombination" für die Map würde mich hauptsächlich interessieren.)

[EDIT]
Folgendes "funktioniert" auf den ersten Blick:
Java:
private Map<Class<? extends Entity>,View<? extends Entity>> map = new HashMap<Class<? extends Entity>,View<? extends Entity>>();
	
	{
		map.put(Bomb.class, new BombView());
	}

ABER: folgendes funktioniert auch, soll aber nicht.

Java:
map.put(Bomb.class, new FigurView());


[/EDIT]
 
Zuletzt bearbeitet:
Neee ^^

natürlich sollte genauso auch
Java:
map.put(Figur.class, new FigurView());
und
Java:
map.put(Stone.class, new StoneView());

funktionieren
 
Was genau ist [c]RotatedEntity[/c]? Lässt sich da vllt. irgendwo ein leeres Hilfsinterface einfügen? also
[c]Map<Class<? extends HelperInterface>, ? extends View<? extends HelperInterface>>[/c]
 
Was genau ist [c]RotatedEntity[/c]? Lässt sich da vllt. irgendwo ein leeres Hilfsinterface einfügen? also
[c]Map<Class<? extends HelperInterface>, ? extends View<? extends HelperInterface>>[/c]

das wäre sowas wie:

Java:
public abstract class Entity implements Helper{...}
public abstract class RotatedEntity extends Entity{...}

Java:
private Map<Class<? extends Helper>,? extends View<? extends Helper>> map = 
	new HashMap<Class<? extends Helper>,? extends View<? extends Helper>>();


Code:
Cannot instantiate the type HashMap<Class<? extends Helper>,? extends View<? extends Helper>>

Sieht so aus als ob eine Wildcard nie "erzeugt" werden kann.
 
Dann lass doch das [c]? extends[/c] bei den Values einfach weg.
Java:
private Map<Class<? extends Helper>,? extends View<? extends Helper>> map = 
    new HashMap<Class<? extends Helper>, View<? extends Helper>>();
Möglicherweise brauchst du ja nichtmal mehr das Interface, da [c]Entity[/c] dafür bereits vollkommen ausreicht.
 
Dann lass doch das [c]? extends[/c] bei den Values einfach weg.
Java:
private Map<Class<? extends Helper>,? extends View<? extends Helper>> map = 
    new HashMap<Class<? extends Helper>, View<? extends Helper>>();
Möglicherweise brauchst du ja nichtmal mehr das Interface, da [c]Entity[/c] dafür bereits vollkommen ausreicht.

Okay,

Java:
private Map<Class<? extends Entity>,? extends View<? extends Entity>> map = 
	new HashMap<Class<? extends Entity>,View<? extends Entity>>();
Java:
map.put(Bomb.class, new BombView());
->
Code:
The method put(Class<? extends Entity>, capture#1-of ? extends View<? extends Entity>) in the type Map<Class<? extends Entity>,capture#1-of ? extends View<? extends Entity>> is not applicable for the arguments (Class<Bomb>, BombView)

Wenn ich nun noch
Java:
? extends
bei der Deklaration weglasse bin ich wieder im EDIT-Teil des Ausgangsposts.
 
;( Grrrr... ja shit... ist zum auswachsen. Bis zu deinem Edit hab' ich auch gedenkt, das des geht.
 
Schau mal in Effective Java nach. Item 29 könnte etwas für dich sein.

Java:
// Typesafe heterogeneous container pattern - implementation
public class Favorites {
    private Map<Class<?>, Object> favorites = new HashMap<Class<?>, Object>();

    public <T> void putFavorite(Class<T> type, T instance) {
        if (type == null)
            throw new NullPointerException("Type is null");
        favorites.put(type, instance);
    }

    public <T> T getFavorite(Class<T> type) {
        return type.cast(favorites.get(type));
    }
}
 

Zurück
Oben