【问题标题】:Kotlin Generics and nullable Class typeKotlin 泛型和可为空的类类型
【发布时间】:2017-06-25 08:02:33
【问题描述】:

如何在 Kotlin 中处理可为空的泛型 Class 类型?

带有泛型的示例函数:

fun <I> calculateStuff(valueType: Class<I>, defaultValue: I): I {
    // do some work

    return defaultValue;
}

这是一个调用函数(注意 calculateStuff(...) 的第二个参数)

fun doStuff() {
    // works fine!
    val myVar1 = calculateStuff(String::class.java, "")

    // FAIL (null is not accepted... Error: "Cannot infer type parameter I in....")
    val myVar2 = calculateStuff(String::class.java, null)
}

解决方法(将返回类型更改为 I?并将 defaultValue 更改为 I?):

fun <I> calculateStuff(valueType: Class<I>, defaultValue: I?): I? {
    return defaultValue;
}

首选方法,但 Kotlin 似乎不支持(注意“String?::class.java”):

val myVar2 = calculateStuff(String?::class.java, null)

我真的希望能够向方法 (calculateStuff(...)) 发送返回类型,如果它可以为 null,则作为第一个参数...这样我只需要对如果我在第一个参数中传递一个可为空的类,则返回值。

这可以在 Kotlin 中实现吗?

【问题讨论】:

    标签: kotlin


    【解决方案1】:

    你需要把Class&lt;I&gt;改成Class&lt;out I&gt;:

    fun <I> calculateStuff(valueType: Class<out I>, defaultValue: I): I {
        return defaultValue;
    }
    

    您也可以使用reified type parameters:

    inline fun <reified I> calculateStuff(defaultValue: I): I {
        // do some work
    
        return defaultValue;
    }
    

    用法:

    val myVar1 = calculateStuff("")             // myVar1 is String
    val myVar2 = calculateStuff<String?>(null)  // myVar2 is String?
    

    【讨论】:

      【解决方案2】:

      由于您发现无法指定可为空的类,因此无法通过第一个变量来限制它。

      可以通过添加第二个泛型参数来限制第二个变量的可空性:

      fun <I, NI: I> calculateStuff(valueType: Class<NI>, defaultValue: I): I {
          // do some work
      
          return defaultValue;
      }
      

      val myVar2 = calculateStuff(String::class.java, null as String?) 现在将编译。

      之所以如此,是因为在 kotlin 类型系统中,T 是 T? 的子类,因此任何不可为空的值都是可空类型的可接受值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-25
        • 2018-08-08
        • 1970-01-01
        • 2022-11-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多