2015-10-15 8 views
5

私はクラスコトルのジェネリックタイプをチェックするには?

class Generic<T : SuperType>() 

を持っており、このコードが正しい

fun typeCheck(s: SuperType): Unit { 
      when(s){ 
       is T -> //do some thin 
      } 
     } 

をis'tが、Ts as Tショー警告型にsをキャスト - 危険なキャストを。
sのタイプはTであることを確認しますか?

+0

文字列は最終的に、なぜ 'T:String'を使用しますか? –

+0

@cypressiousその単なる例 – andreich

答えて

5

実行時にジェネリック型がJVM上で反映されないため、Kotlinでこれを行う方法はありません。コンパイラは、キャストが実行されたときに失敗する命令を生成できないため、キャストはチェックされていないため、プログラムは後でいつでも中断することがあります。

インライン関数で使用される可能性のある関連機能はreified type parametersです。クラスはタイプパラメータを変更することはできません。したがって、ユースケースについてさらに詳しく説明すると、必要と思われるものを達成するのを手伝うことができます。

13

何かがジェネリックタイプTであるかどうかを確認する必要がある場合は、チェックするためにClass<T>のインスタンスを持つ必要があります。これはKotlinのJava Hwoeverの一般的なテクニックです。クラスオブジェクトを取得するインラインファクトリメソッドを利用できます。

class Generic<T : Any>(val klass: Class<T>) { 
    companion object { 
     inline operator fun <reified T : Any>invoke() = Generic(T::class.java) 
    } 

    fun checkType(t: Any) { 
     when { 
      klass.isAssignableFrom(t.javaClass) -> println("Correct type") 
      else -> println("Wrong type") 
     } 

    } 
} 

fun main(vararg args: String) { 
    Generic<String>().checkType("foo") 
    Generic<String>().checkType(1) 
} 
+0

私の質問に答えることができますか? https://stackoverflow.com/questions/47418161/kotlin-get-type-of-generic-class-without-instance – murt

+0

すごいトリック! 'Generic'クラスが抽象クラスであるときにそれを動作させる方法を知っていますか?私が抱えている問題は、 'invoke'演算子で子オブジェクトをインスタンス化することです。 – ESala

+0

そう簡単には動作しません。子クラスのコンストラクタは 'Class'インスタンスをスーパーコンストラクタに渡す必要があります。 –

関連する問題