2014-02-25 50 views
0

我想在輕型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方法的參數類型TObject

不知怎的,我要投給T泛型類型的object不知道它是什麼類型? 我就要真的很困惑,所以我要問你的幫助,以看得更清楚。

+0

初始化renderes地圖第一 –

+0

@ jw23首選移除一部分,因爲它是不是對你很重要,但不要擔心,我初始化我的增值經銷商) – Arsleust

回答

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

} 
+1

完美的作品!我得到unchecked和rawtypes警告,但它應該沒問題。謝謝 ! – Arsleust

+0

@Arsleust嘗試將@「SuppressWarnings」註釋移動到類的開頭。 Eclipse是99%的標準,但有一些怪癖。 ;) –

0

該死的仿製藥,全速前進!

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

演員一般Renderer<?>只是一個Renderer。它打破了通用類型系統,但它應該是安全的。你已經確定了這一點。

+0

它抑制錯誤,但我得到選中和rawtypes警告......應該是足夠的想法,非常感謝! – Arsleust

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

你不能直接從'Renderer '投射到'Renderer ',你需要在它們之間施放'(Renderer)'。 :P –

+0

@PeterLawrey:你爲什麼這麼想? –

+0

編譯器不允許您從一個泛型類型轉換爲不兼容的泛型類型。你必須使用類型擦除來欺騙編譯器。 –

相關問題