具有泛型返回类型的函数

Joh*_*nny 3 generics kotlin

是否可以使用返回泛型类型的函数?就像是:

fun <T> doSomething() : T {
    when {
        T is Boolean -> somethingThatReturnsBoolean()
        T is Int -> somethingThatReturnsInt()
        else -> throw Exception("Unhandled return type")
    }
}
Run Code Online (Sandbox Code Playgroud)

Mih*_*x64 9

您可以使用reified类型来捕获其类文字,如下所示:

inline fun <reified T> doSomething() : T {
    return when (T::class.java) {
        Boolean::class.java -> somethingThatReturnsBoolean() as T
        Int::class.java -> somethingThatReturnsInt() as T
        else -> throw Exception("Unhandled return type")
    }
}
Run Code Online (Sandbox Code Playgroud)

但是你也必须说服编译器T是布尔值,或者T是Int,就像在示例中一样,使用未经检查的强制转换.

reified使真实T类型可访问,但仅适用于内联函数.如果您想要常规功能,可以尝试:

inline fun <reified T> doSomething() : T = doSomething(T::class.java)
fun <T> doSomething(klass: Class<T>): T {
    return when (klass) { ... }
}
Run Code Online (Sandbox Code Playgroud)