使用Object参数使用泛型参数调用方法

时间:2014-02-25 09:18:17

标签: java generics

我正在尝试在轻型2D游戏引擎中制作一些RessourceManager。我想要一个像这样的RessourceManager:

package com.Arsleust.DayumCorp.DayumEngine.Ressource;

import java.awt.Graphics2D;
import java.util.HashMap;

public class RessourceManager {

    private HashMap<Class<?>, Renderer<?>> renderers;

    public void registerRenderer(Class<?> objclass, Renderer<?> renderer) {
        this.renderers.put(objclass, renderer);
    }

    public void render(Graphics2D g, Object object) {
        Class<?> objclass = object.getClass();
        if(this.renderers.get(objclass) != null) {
            this.renderers.get(objclass).render(g, object); 
        }
    }

}

使用此对象:

package com.Arsleust.DayumCorp.DayumEngine.Ressource;

import java.awt.Graphics2D;

public abstract class Renderer<T> {

    public abstract void init();

    public abstract void render(Graphics2D g, T object);

}

this.renderers.get(objclass).render(g, object);发生错误,Eclipse要求我创建一个新方法或将Renderer.render方法的参数类型T更改为Object

不知何故,我必须转换为T泛型类型object,而不知道它是什么类型...... 我真的很困惑,所以我要求你的帮助,以便更清楚地看到它。

3 个答案:

答案 0 :(得分:0)

该死的仿制药,全速前进!

((Renderer) renderers.get(objclass)).render(g, object);

将通用Renderer<?>投射到Renderer。它打破了通用类型系统,但它应该是安全的。你已经确定了这一点。

答案 1 :(得分:0)

您使用的是Renderer<?>,这意味着您拥有Renderer未知类型。即你可以获得这种类型的元素,因为它将是Object,但你不能传递这种类型的元素,因为你不知道它是什么。即编译器无法确定它是否正确。

你需要做的是自己处理类型检查,编译器会抱怨这个,因为它不能在这里检查你。

public class RessourceManager {

    private final Map<Class, Renderer> renderers;

    public <T> void registerRenderer(Class<T> objclass, Renderer<T> renderer) {
        this.renderers.put(objclass, renderer);
    }

    @SuppressWarnings("unchecked")
    public void render(Graphics2D g, Object object) {
        Class objclass = object.getClass();
        if(this.renderers.get(objclass) != null) {
            this.renderers.get(objclass).render(g, object); 
        }
    }

}

答案 2 :(得分:0)

public class RessourceManager {

    private HashMap<Class<?>, Renderer<?>> renderers;

    public <V> void registerRenderer(Class<V> objclass, Renderer<V> renderer) {
        this.renderers.put(objclass, renderer);
    }

    public <V> void render(Graphics2D g, V object) {
        Class<?> objclass = object.getClass();
        if(this.renderers.get(objclass) != null) {
            ((Renderer<V>)this.renderers.get(objclass)).render(g, object);
        }
    }
}