Kotlingenerics和可空类types

如何处理Kotlin中的可空generics类?

generics的示例函数:

fun  calculateStuff(valueType: Class, 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) } 

解决方法(将返回types更改为I?AND defaultValue为I):

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

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

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

我真的希望能够发送到方法(calculateStuff(…))的返回types,如果它可以为空,作为第一个参数…我只需要null检查返回值if我在第一个参数中通过一个可空的类。

Kotlin可以这样做吗?

您需要将Class更改为Class

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

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

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

用法:

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

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

有可能的是通过添加第二个generics参数来限制第二个variables的可空性。

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

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

这个工作的原因是因为在kotlintypes系统中, TT的一个子类T? 所以任何非空值都是可空types的可接受值。