Kotlin 中可以省略类型参数吗?

Jon*_*onn 2 generics kotlin

我正在将一个非常古老且大型的 Java 服务器转换为 Kotlin,并且我试图在转换过程中尽可能少地进行逻辑更改。我正在寻找一种方法来翻译这段 Java 代码而不从根本上改变它。

考虑以下玩具代码:

interface Pet

class Dog : Pet
class Cat : Pet

class PetSitter<T : Pet> {
  fun walk(pet: T) {}
}

fun main() {
  val sitters: Array<PetSitter<*>> =
      arrayOf(PetSitter<Cat>(), PetSitter<Dog>())

    sitters[0].walk(Cat()) // Type mismatch.
                           // Required: Nothing
                           // Found: Cat
}
Run Code Online (Sandbox Code Playgroud)

这无法编译并显示消息Type mismatch: inferred type is Cat but Nothing was expected

在 Java 中,以下工作正常:

PetSitter[] sitters = ... // Note: PetSitter's generic is omitted
sitters[0].walk(new Cat());
Run Code Online (Sandbox Code Playgroud)

是否可以Array<PetSitter>在 Kotlin 中类似地定义 a (没有宠物泛型)?或者其他一些方法可以使参数类型为PetSitter<*>.walkbePet而不是Nothing

Ten*_*r04 5

在 Java 中,这称为原始类型。仅出于向后兼容性的需要才支持它,并且不鼓励使用它,因为它违背了使用泛型的目的。出于同样的原因,Kotlin 完全禁止它,因为它没有必须支持的语言的预泛型版本。

使用原始类型的等效方法是将类型转换为宽松类型。这个要求就是迫使你考虑演员阵容是否合适。

(sitters[0] as PetSitter<Cat>).walk(Cat())
Run Code Online (Sandbox Code Playgroud)