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

时间:2019-05-18 20:50:12

标签: generics kotlin

Misc.kts包含:

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

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

1 个答案:

答案 0 :(得分:6)

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

B有一个值可以使return E()合法。那时BE,通话中也是如此foo<E>()。但是,这是 only 这种情况。如果我致电foo<Int>(),该怎么办?当期望E()时,您将无法返回Int

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