Kotlin泛型和可空类类型

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

泛型的示例函数:

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?AND 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(…))的返回类型,如果它可以为空,作为第一个参数…我只需要空值检查返回值if我在第一个参数中通过一个可空的类。

Kotlin可以这样做吗?

您需要将Class<I>更改为Class<out I>

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

你也可以使用实体类型参数来做到这一点:

 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? 

由于没有办法指定可空的类,因此您将第一个变量限制的前提是不可能的。

有可能的是通过添加第二个泛型参数来限制第二个变量的可空性。

 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类型系统中, TT的一个子类T? 所以任何非空值都是可空类型的可接受值。