簡體   English   中英

從類轉換對象以適合通用

[英]Casting Object From Class To Fit Generic

我有一個接收Class<? extends EntityBase>的地圖Class<? extends EntityBase> Class<? extends EntityBase>並給出GenericRenderer<? extends EntityBase> GenericRenderer<? extends EntityBase> GenericRenderer<? extends EntityBase>里面GenericRenderer<? extends EntityBase> GenericRenderer<? extends EntityBase> ,有一個名為draw的方法,它接受一個SpriteBatch和一個extends EntityBase的對象(因為GenericRenderer持有<? extends EntityBase>作為泛型)。

我正在使用地圖來保存所有實體的渲染器,但是當我調用draw方法時,Eclipse會顯示以下錯誤:

GenericRenderer類型中的方法繪制(SpriteBatch,捕獲#3-of?extends EntityBase)不適用於參數(SpriteBatch,捕獲#4-of?extends EntityBase)

這是我用來遍歷我的實體的代碼,將它們轉換為EntityBase,抓取它們的渲染器,並通過它運行它們:

for(Entity entity : gameStage.getEntityEngine().getEntities()) {
    if(entity instanceof EntityBase) {
         EntityBase entityBase = (EntityBase) entity;

         GenericRenderer<? extends EntityBase> renderer = 
                 Betley.instance.renderer.getRenderer(entityBase.getClass());

         renderer.draw(batch, entityBase.getClass().cast(entityBase));
    }
}

? extends EntityBase ? extends EntityBase意味着它可能僅限於子類型,但您不知道哪個子類型。 這意味着編譯器無法確定您傳遞的對象實際上是否為正確的類型。

想象一下,你有一對名為FooBar的類都擴展了EntityBase 如果你的renderer變量是GenericRenderer<? extends EntityBase> GenericRenderer<? extends EntityBase> ,這意味着它引用的對象可以是GenericRenderer<Foo> ,也可以是GenericRenderer<Bar> 編譯器不知道哪個,它可能因實體而異。

因此,當您調用draw ,您已將您的entityBase引用轉換為特定類型,如FooBar ,但編譯器無法確定它是否為正確的類。 您可能正在嘗試將Foo傳遞給實際上是Renderer<Bar>Renderer<Bar> ,反之亦然。 這就是你得到錯誤的原因。 ? extends EntityBase ? extends EntityBase並不意味着“接受EntityBase任何子類”,它意味着“可能僅限於我們不知道的單個子類”。

我懷疑你的基本設計與Java的泛型工作方式並不完全兼容:如果你有一個Map值為GenericRenderer<? extends EntityBase> GenericRenderer<? extends EntityBase> ,這意味着你計划有一些GenericRenderer<Foo> ,一些是GenericRenderer<Bar> ,依此類推。 但是在編譯時沒有關於每個渲染器需要哪種類型的實體的信息,因此編譯器無法檢查您是否將正確類型的實體傳遞給每個渲染器。

您可能需要將地圖的值類型更改為GenericRenderer<EntityBase>並在每個渲染器的draw方法中放置一個GenericRenderer<EntityBase> ,以檢查(在運行時)是否傳遞了正確的實體類型。 或者,提出一種不涉及在單個集合中混合不同類型的渲染器的設計。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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