2016-08-09 7 views
7

私は初期化されていないの値を設定して実験していて、次のことを実行しようとしていました。これは主に、標準化されたジェネリック医薬品の力(そして限界)の好奇心です。Kotlin reified型パラメータはスマートキャストを受けません

私は、データクラスのオプションのパラメータのデフォルト値を提供しようとしていました。

inline fun <reified T> uninitialized(): T = when (T::class) { 
    Long::class -> -1L // Type mismatch. Required: T Found: Long 
    String::class -> "" // Type mismatch. Required: T Found: String 
    // and so on... 
    else -> throw UnsupportedOperationException("No uninitialized value defined for " + T::class) 
} 

data class Thing(
    var id: Long = uninitialized(), 
    var name: String = uninitialized() // and so on... 
) 

whenis Type条項が含まれ、Kotlinはスマートキャストを持っています。この例では、スマートキャストはキックインされないので、これはコンパイルされません。

同様の目的を達成するためのアイデアはありますか?あなたはその型をチェックしたりnullとそれを比較することisを使用した後

答えて

6

スマートキャストは、特定のオブジェクトに適用されます。あなたの例では、タイプをチェックする特定のオブジェクトはなく、スマートキャストを適用するものはありません。

ただし、手動キャストをTに適用すると、期待どおりに動作します。ここにあなたのサンプル関数の作業バージョンは1.1で修正されますKotlinの反射ライブラリの特殊性に対処するために更新、です:

inline fun <reified T : Any> uninitialized(): T = when (T::class.java) { 
    Long::class.javaPrimitiveType, Long::class.javaObjectType -> -1L as T  
    String::class.java -> "" as T 
    // and so on... 
    else -> throw UnsupportedOperationException("No uninitialized value defined for " + T::class) 
} 

data class Thing(
    var id: Long = uninitialized(), 
    var name: String = uninitialized() // and so on... 
) 

fun main(args: Array<String>) { 
    val t = Thing() 
    println(t.id) 
} 
+0

'T'は 'の最後に' when'全体に適用することができます初期化されていない ' – voddan

関連する問題