Kotlin泛型和可空类型

时间:2017-02-07 21:48:13

标签: 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?将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做吗?

2 个答案:

答案 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类型系统中,TT?的子类,所以任何不可为空的值都是可以为空的类型的可接受值。