【问题标题】:Cannot use 'T' as reified type parameter不能使用“T”作为具体类型参数
【发布时间】:2019-08-23 17:17:15
【问题描述】:

/** 这个“T::class.java”报错:Cannot use 'T' as reified type parameter。改用类! 那么我该如何解决它或者我能做些什么来实现这种方式?请。 **/ 看下一段kotlin代码

data class PostHttpResultBean<T>(private var errno:Int,private var error:String,private var data:String):IHttpResultEntity<T>{
override val errorCode: Int
    get() = errno
override val errorMessage: String
    get() = error
override val isSuccess: Boolean
    get() = errno==0
override val result:T
    get() = RSAUtil.dataDecrypt(RSAUtil.getKeyPassword(), data,T::class.java)!!

class RSAUtil {
companion object {
fun <T> dataDecrypt(password: String, data: String, java: Class<T>): T? {
    val content = Base64.decode(data.toByteArray(), Base64.NO_WRAP)
    try {
        var deString = decrypt(content, password)
        if (!deString.isEmpty()){
            val first = deString.substring(0, deString.lastIndexOf(":") + 1)
            deString = "$first$deString}"
            return Gson().fromJson(deString,java)
        }

        return null
    } catch (e: Exception) {
        e.printStackTrace()
    }

    return null
 }
 }
 }

【问题讨论】:

标签: android kotlin


【解决方案1】:

你应该像这样更改dataDecrypt

inline fun <reified T> dataDecrypt(password: String, data: String): T? {
     ...
     try {
          ...
          if (!deString.isEmpty()){
              ...
              return Gson().fromJson(deString, T::class.java)
          }
          ...
     }
 }

在调用站点上,T 类型将从 result 推断:

override val result:T
get() = RSAUtil.dataDecrypt(RSAUtil.getKeyPassword(), data)!!

您可以阅读有关内联函数和具体类型的更多信息here,我强烈建议您这样做。我还要指出您的代码格式不正确,建议在nullability checks 中使用?: 而不是!!,并且在Kotlin 中不鼓励伴随对象,您可以在类之外定义函数并使用(或导入) 就好像它们是静态的一样。

【讨论】:

    猜你喜欢
    • 2017-11-20
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-09
    • 2020-08-19
    相关资源
    最近更新 更多