Moshi找不到我用Kotlin编写的自定义适配器作为参数化类型

时间:2018-07-26 23:13:34

标签: java json kotlin moshi

我有一个针对Moshi的自定义JSON适配器,用于类似以下的字节字符串列表。

@Retention(RUNTIME)
@JsonQualifier
annotation class HexString

object ByteStringListAdapter {
  @ToJson fun toJson(@HexString byteStrings: List<@JvmSuppressWildcards ByteString>): List<String> {
    return byteStrings.map { it.hex() }
  }

  @FromJson @HexString fun fromJson(json: List<String>): List<@JvmSuppressWildcards ByteString> {
    return json.map { ByteString.decodeHex(it) }
  }
}

fun main(args: Array<String>) {
  val moshi = Moshi.Builder()
      .add(ByteStringListAdapter)
      .build()
  val byteStringListAdapter = moshi.adapter<List<ByteString>>(
      Types.newParameterizedType(List::class.java, ByteString::class.java), HexString::class.java)
}

即使我已经在main中正确注册了该软件,运行该程序仍将失败,并显示java.lang.IllegalArgumentException: No @ToJson adapter for java.util.List<okio.ByteString> annotated [@HexString()]

为什么Moshi找不到我的@HexString List<ByteString>的注册适配器?

1 个答案:

答案 0 :(得分:3)

toJson函数的参数需要@JvmSuppressWildcards

@ToJson fun toJson(@HexString byteStrings: List<@JvmSuppressWildcards ByteString>): List<String> {
  return byteStrings.map { it.hex() }
}

没有它,Moshi将看到List<? extends ByteString>并且无法匹配类型以找到适配器。