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

标签 kotlin generics

我正在将一个非常古老且大型的 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
}

编译失败,并显示消息 Type mismatch: inferred type is Cat but Nothing was expected .

在 Java 中,以下工作正常:

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

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

最佳答案

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

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

(sitters[0] as PetSitter<Cat>).walk(Cat())

关于kotlin - Kotlin 中可以省略类型参数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70114348/

相关文章:

java - 定位特定的 Micronaut WebSocket 连接

Kotlin 主构造函数调用辅助构造函数

asp.net - 将通用类与ObjectDataSource一起使用

json - 使用Gson库动态解析未知数据

java - 在 Java 字段中存储类泛型

Android Kotlin 将值从文本字段传递到 numberPicker

android - 无法在 kotlin 中获取 firebase 当前用户

java - 无法调用在 Java 6 中作为上界 ("extends"泛型接收的类的静态方法?

java - 如何使通用类型可序列化?

kotlin - vlcj - 如何在播放前更改音频音量?