2017-03-22 15 views
0

私はComponentを継承するオブジェクトのコレクションを持っています。具体的なクラスでオブジェクトを見つけて返す関数が必要です。
しかし、Kotlinはキャストが好きではなく、@Suppress("UNCHECKED_CAST")を追加すると醜いです。Kotlin - 型で要素を見つけてキャストする方法

私は次のコードを持っている:

open class GameObjectImpl : GameObject { 
    private val attachedComponents = mutableSetOf<Component>() 

    @Suppress("UNCHECKED_CAST") 
    override fun <TComponent : Component> getComponent(type: KClass<TComponent>): TComponent? { 
     return attachedComponents.find { type.isInstance(it) } as? TComponent 
    } 
} 

答えて

4

をこれはあなたのために働く必要があります。

open class GameObjectImpl : GameObject { 
    val attachedComponents = mutableSetOf<Component>() 

    override inline fun <reified TComponent : Component> getComponent(type: KClass<TComponent>): TComponent? { 
     return attachedComponents.filterIsInstance<TComponent>().firstOrNull() 
    } 
} 
+0

ニート、Kotlinは、すでにビルトイン、私はそれを知らなかったということがあります。 ありがとうございます。 – danielspaniol

+1

このコンパイルを行うには、 'TComponent''を' reified'(そして 'attachedComponents'' public')または' filterIsInstance(type.java) 'を使う必要があります。 – mfulton26

+1

@ mfulton26ああ、 'filterIsInstance'には改訂されたパラメータが必要であることを忘れています。ありがとうございました。 – ean5533

関連する問題