2017-10-17 8 views
3

私はアンドロイドプロジェクトのためにKotlin言語でいくつかの特定のGSON TypeAdapterを実装しようとしています。 Type inference failed: 'T' cannot capture 'in (T..T?'. Type parameter has an upper bound 'Enum<T>' that cannot be satisfied capturing 'in' projectionTypeAdapterをKotlinに実装するタイプアダプターファクトリーを実装する

コードは以下の通りです:

class SmartEnumTypeAdapterFactory(fallbackKey: String) : TypeAdapterFactory { 

    private val fallbackKey = fallbackKey.toLowerCase(Locale.US) 

    override fun <T : Any> create(gson: Gson?, type: TypeToken<T>): TypeAdapter<T>? { 
     val rawType = type.rawType 
     return if (!rawType.isEnum) null else SmartEnumTypeAdapter(rawType) 
    } 

    class SmartEnumTypeAdapter<T : Enum<T>>(classOfT: Class<T>) : TypeAdapter<T>() { 

     override fun write(out: JsonWriter?, value: T) { 
      TODO("not implemented") 
     } 

     override fun read(`in`: JsonReader?): T { 
      TODO("not implemented") 
     } 
    } 
    } 

私はTypeAdapterのパラメータとしてclassOfT: Class<T>を持ちたい理由の外にある

私が直面してる問題は、タイプが推測できないとエラーをコンパイルしていますこの問題の文脈。

+0

これは本当にトリッキーなケースです...あなたはJavaでこの事を実装しようとしたことがありますか?それで、あなたはKotlinに変換し、それがうまくいくかどうかを見ることができますが、これまでのところ、どちらの言語でもこれを動作させることはできませんでした。 – Robin

答えて

0

上書きしているメソッド(TypeFactory.create)には上限がありません(これはKotlinでは<T : Any>になります)。これは不可能です。 createメソッドではTは ではなく、Enum<T>であることが保証されています(アダプタに引数として渡すことはできません)。

あなたができることは、アダプタクラスの上限を削除して、それを非公開にして、あなたの工場だけがインスタンスを作成できるようにすることです(ファクトリは型が列挙型であるかどうかを検証済みです)。

class SmartEnumTypeAdapterFactory(fallbackKey: String) : TypeAdapterFactory { 

    private val fallbackKey = fallbackKey.toLowerCase(Locale.US) 

    override fun <T> create(gson: Gson?, type: TypeToken<T>): TypeAdapter<T>? { 
     val rawType = type.rawType 
     return if (!rawType.isEnum) null else SmartEnumTypeAdapter(rawType) 
    } 

    private class SmartEnumTypeAdapter<T>(classOfT: Class<in T>) : TypeAdapter<T>() { 

     override fun write(out: JsonWriter?, value: T) { 
      TODO("not implemented") 
     } 

     override fun read(`in`: JsonReader?): T { 
      TODO("not implemented") 
     } 
    } 
} 

は(TypeToken.rawType()Class<? super T>を返すためclassOfTClass<in T>ある)

関連する問題