[英]Invoke method with generic argument using Object argument
我正在尝试在轻型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
。
不知何故,我不得不将object
转换为T
泛型类型,却不知道它是什么类型。
该死的仿制药,全速前进!
((Renderer) renderers.get(objclass)).render(g, object);
将通用Renderer<?>
强制转换为Renderer
。 它打破了通用类型系统,但是应该是安全的。 您已经确定了这一点。
您正在使用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);
}
}
}
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.