簡體   English   中英

使用對象參數調用具有通用參數的方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM