简体   繁体   English

使用对象参数调用具有通用参数的方法

[英]Invoke method with generic argument using Object argument

I am trying to make some RessourceManager in a light 2D game engine. 我正在尝试在轻型2D游戏引擎中制作一些RessourceManager。 I want to have a RessourceManager like this : 我想要一个像这样的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); 
        }
    }

}

using this 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);

}

but this.renderers.get(objclass).render(g, object); 但是this.renderers.get(objclass).render(g, object); makes an error, and Eclipse asks me to create a new method or to change the Renderer.render method's argument type T to Object . 发生错误,Eclipse要求我创建一个新方法或将Renderer.render方法的参数类型T更改为Object

Somehow I have to cast to that T generic type the object without know what type it is... I'm getting really confused so i'm asking your help to see it more clearly. 不知何故,我不得不将object转换为T泛型类型,却不知道它是什么类型。

Damn the generics, full speed ahead! 该死的仿制药,全速前进!

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

Cast the generic Renderer<?> to just a Renderer . 将通用Renderer<?>强制转换为Renderer It's breaking the generic type system, but it should be safe. 它打破了通用类型系统,但是应该是安全的。 You've made sure of that. 您已经确定了这一点。

You are using a Renderer<?> which means you have a Renderer of an unknown type. 您正在使用Renderer<?> ,这意味着您具有未知类型的Renderer ie you can get an element of this type as it will be an Object but you cannot pass an element of this type because you don't know what it is. 即,您可以获取这种类型的元素,因为它将是一个Object但是您不能传递这种类型的元素,因为您不知道它是什么。 ie the compiler cannot be sure it is right. 即编译器不能确定它是正确的。

What you need to do is handle the type checking yourself and the compiler will complain about this because it can't check for you here. 您需要做的是自己检查类型,编译器会抱怨这一点,因为它在这里无法为您检查。

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); 
        }
    }

}
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);
        }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM