[英]Is it possible to instantiate a generic class by casting a “new Object()” as the generic class?
[英]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
意味着它可能僅限於子類型,但您不知道哪個子類型。 這意味着編譯器無法確定您傳遞的對象實際上是否為正確的類型。
想象一下,你有一對名為Foo
和Bar
的類都擴展了EntityBase
。 如果你的renderer
變量是GenericRenderer<? extends EntityBase>
GenericRenderer<? extends EntityBase>
,這意味着它引用的對象可以是GenericRenderer<Foo>
,也可以是GenericRenderer<Bar>
。 編譯器不知道哪個,它可能因實體而異。
因此,當您調用draw
,您已將您的entityBase
引用轉換為特定類型,如Foo
或Bar
,但編譯器無法確定它是否為正確的類。 您可能正在嘗試將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.