我正在将一个非常古老且大型的 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?
在 Java 中,这称为原始类型。仅出于向后兼容性的需要才支持它,并且不鼓励使用它,因为它违背了使用泛型的目的。出于同样的原因,Kotlin 完全禁止它,因为它没有必须支持的语言的预泛型版本。
使用原始类型的等效方法是将类型转换为宽松类型。这个要求就是迫使你考虑演员阵容是否合适。
(sitters[0] as PetSitter<Cat>).walk(Cat())
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
797 次 |
| 最近记录: |