2016-05-10 9 views
3

Class<T>を与えると、Class<T> where T : Enum<T>が必要なメソッド/コンストラクタをどのように呼び出すか呼び出しますか?Kotlinのメソッドを別の上限で呼び出すにはどうすればよいですか?

fun <T : Any> handleAny(classOfT: Class<T>) { 
    if (classOfT.isEnum) { 
     handleEnum(classOfT) 
    } 
} 

fun <T : Enum<T>> handleEnum(classOfT: Class<T>) { /*...*/ } 

エラー:inferred type T is not a subtype of kotlin.Enum<T>

Javaでは、私は未チェックの呼び出しを行うことができますが、私はKotlinで似た何かをする方法を見つけるように見えることはできません。

+0

FYI:下記のホットキーの素晴らしい回避策に加えて、https://youtrack.jetbrains.com/issue/KT-12393を作成しました。 – mfulton26

答えて

4

私はそれのために、この非常にハック回避策を見つけた今のとおり:、(それはDummyEnumなりましょう)という考えが上限を満たす任意のジェネリックパラメータで型に未チェックのキャストを作ることです

private enum class DummyEnum  

fun <T> handleAny(classOfT: Class<T>) { 
    if (classOfT.isEnum) { 
     handleEnum(classOfT as Class<DummyEnum>) //absolutely any enum goes 
    } 
} 

fun <T : Enum<T>> handleEnum(classOfT: Class<T>) { 
    println(classOfT.toString()) 
} 

ましたとにかく実行時に消去されます。 handleEnumは型パラメータを具体化した場合、それは静的に推論されたタイプ(DummyEnum)に代入されます:

制限が解決が具体化ジェネリックで正常に動作しないということです。