首页 文章

Kotlin泛型和可空类型

提问于
浏览
0

如何在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似乎不支持(注意“String?:: class.java”):

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

我真的希望能够向方法(calculateStuff(...))发送返回类型,如果它可以为null,则作为第一个参数......这样我只需要对返回值进行空值检查我在第一个参数中传递了一个可以为空的类 .

这可以在Kotlin做吗?

2 回答

  • 1

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

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

    您也可以使用reified type parameters执行此操作:

    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?
    
  • 2

    由于无法像您发现的那样指定可为空的类,因此无法通过第一个变量来限制它 .

    可能的是通过添加第二个通用参数来限制第二个变量的可为空性:

    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? 的子类,因此任何非可空值都是可空类型的可接受值 .

相关问题