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