如何在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?将defaultValue更改为I?):
fun <I> calculateStuff(valueType: Class<I>, defaultValue: I?): I? {
return defaultValue;
}
首选方法,但似乎Kotlin不支持(注意&#34; String?:: class.java&#34;):
val myVar2 = calculateStuff(String?::class.java, null)
我真的希望能够向方法(calculateStuff(...))发送返回类型,如果它可以为null,则作为第一个参数......这样我只需要检查如果我在第一个参数中传递一个可为空的类,则返回值。
这可以在Kotlin做吗?
答案 0 :(得分:2)
您需要将use std::ffi::OsStr;
fn main() {
let file_path = std::path::Path::new("index.html");
let content_type = file_path.extension().and_then(OsStr::to_str).and_then(|ext| {
match ext {
"html" => Some("text/html"),
"css" => Some("text/css"),
"js" => Some("application/javascript"),
_ => None,
}
});
}
更改为Class<I>
:
Class<out I>
您也可以使用reified type parameters执行此操作:
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;
}
答案 1 :(得分:1)
由于没有办法像你发现的那样指定可空类,你不能用第一个变量来限制它。
通过添加第二个通用参数,可以通过第二个变量的可为空性来限制它:
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?
的子类,所以任何不可为空的值都是可以为空的类型的可接受值。