为什么这种带有泛型的Kotlin代码会产生Type Mismatch编译器错误?

Jul*_* A. 0 generics kotlin

Misc.kts包含:

class E
fun <B> foo(): B {
    return E() // <--- Error here
}
fun bar() {
    val r = foo<E>()
}
Run Code Online (Sandbox Code Playgroud)

错误是Type mismatch: inferred type is Misc.E, but B was expected。这种编译器行为使我感到惊讶。谢谢您的解释。

Ale*_*ica 6

您可以将通用函数视为函数的Cookie切割器。对于的任何值B,您的通用函数定义都可以标记出不同的函数cookie。

有一个价值B可以使之return E()合法。那时BE,通话中也是如此foo<E>()。但是,这是唯一的情况。如果我打电话foo<Int>()怎么办?E()Int预期到时,您将无法返回。

为了使函数定义有效,仅存在一个与兼容的返回值是不够的B。您返回的值必须与的所有可能值兼容B