Kotlin泛型和可为空的类类型 [英] Kotlin Generics and nullable Class type
问题描述
如何在Kotlin中处理可为空的泛型类类型?
How do I handle a nullable generics Class type in Kotlin?
带有泛型的示例函数:
fun <I> calculateStuff(valueType: Class<I>, defaultValue: I): I {
// do some work
return defaultValue;
}
这是一个调用函数(请注意calculateStuff(...)的第二个参数)
Here is a calling function (note the 2nd param for 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?):
Work-around (change return type to I? AND defaultValue to I?):
fun <I> calculateStuff(valueType: Class<I>, defaultValue: I?): I? {
return defaultValue;
}
首选方法,但Kotlin似乎不支持(请注意"String?:: class.java"):
Preferred method, but does not seemed supported by Kotlin (note "String?::class.java"):
val myVar2 = calculateStuff(String?::class.java, null)
我真的很希望能够将返回类型发送给方法(calculateStuff(...)),如果它可以为null,则将其作为第一个参数...这样,我只需要对null进行检查即可.如果我在第一个参数中传递了一个可为空的Class,则返回值.
I really want to be able to send to the method (calculateStuff(...)) the return type, and if it can be null, as the first parameter... that way I ONLY have to null-check the return value if I pass a nullable Class in the first param.
这在科特林有可能吗?
推荐答案
您需要将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?
这篇关于Kotlin泛型和可为空的类类型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!