簡體   English   中英

ArrayList 的 object 的不同(繼承)類在 Kotlin 中具有通用參數

[英]ArrayList of object of different (Inherited) classes with a generic parameter in Kotlin

注意:為了簡單起見,我刪除了 init 和特定函數等方法。

我有一個名為 Role 的抽象 class。

abstract class Role {}

從那個 class 我繼承了許多類,如騎士,巫師......等。

class Knight(context: Context) : Role() {}
class Srocerer(context: Context) : Role() {}

然后我創建了另一個抽象 Class 具有通用參數R:角色

abstract class Turn<R : Role> {}

不是每個角色(玩家)都能輪到

正如你所料,我還繼承了一些類,如 KngithTurn、SorcererTurn... 等。

class KnightTurn(role : Knight) : Turn<Knight>() {}
class SorcererTurn(role : Sorcerer) : Turn<Sorcerer>() {}

The problem is when I create an arrayList of Turn, and try to add an object of type KnightTurn or SorcererTurn, the IDE says that there is a type mismatch despite the fact that they are inherited from class Turn.

var list = ArrayList<Turn<Role>>()
val knight = KnightTurn(Knight(baseContext))
list.add(knight) 

// Type mismatch
// Required:Turn<Role>
// Found:KnightTurn

在 java 中,我只是這樣解決問題:

ArrayList<Turn<Role?>>

如何在 Kotlin 中做到這一點,或者還有其他解決方案嗎? 先感謝您。

對於那些沒有看到 Stachu 對 OP 的回應的人:

在這種情況下使用“不安全”強制轉換運算符

代碼

list.add(knight as Turn<Role>)

像這樣聲明您的列表表示只有具有完全Role類型參數的Turn可以添加到列表中。

 var list = ArrayList<Turn<Role>>()

如果我理解正確,您希望能夠將Turn與派生自Role的任何內容一起添加。 這意味着您應該使用out關鍵字:

var list = ArrayList<Turn<out Role>>()

在我進行更改后,此代碼編譯沒有錯誤:

val knight = KnightTurn(Knight())
list.add(knight)

暫無
暫無

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

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