参数化类型上的类型推断失败

时间:2019-05-04 07:58:14

标签: kotlin polymorphism higher-kinded-types

说我们有以下几种类型:

abstract class Generic_B

interface Generic_A<Generic_B>

class Concrete_B : Generic_B()

class Concrete_A : Generic_A<Concrete_B>

fun main(args: Array<String>) {
    val a = Concrete_A();
    foo(a);
}

fun foo(thing: Generic_A<Generic_B>) {
}

我收到一条错误消息:

Error:(27, 9) Kotlin: Type mismatch: inferred type is Concrete_A but Generic_A<Generic_B> was expected

我不太了解该错误。

Concrete_AGeneric_A的实例,并且在Generic_B的具体实例上也已参数化。因此,我觉得类型推断应该匹配。

我想我的问题是:

  1. 为什么类型推断不起作用? (这是更高种类的多态吗?)
  2. 我该如何解决?

1 个答案:

答案 0 :(得分:4)

基本上,您刚遇到Generic_A<Generic_B>Generic_A<Concrete_B>扩展的Concrete_A不同的问题。

如果将out方差添加到thing参数通用部分,您将使其正常工作,因为它将接受Generic_B的所有子类型:

fun foo(thing: Generic_A<out Generic_B>) {
}