gpt4 book ai didi

java - Java 类定义的类型推断失败。我该如何解决这个问题?

转载 作者:行者123 更新时间:2023-11-30 05:40:11 24 4
gpt4 key购买 nike

在 Kotlin 中,我发现与 Java 相比,可以使用 covariance 完成以下操作:

ArrayList<Dog> listOfDogs = listOf(dog1, dog2)
ArrayList<Animal> animalList = listOfDogs // No compiler error

在我的情况下,我有一个界面消息:

public interface Message {
RawMessage toRawMessage();
}

例如,我有一条 Int32 消息:

public interface Int32 extends Message {
// abstract methods
}

现在我有一个方法,其参数 type 类型为 Class<Message> :

fun doSomethingWithType(type: Class<Message>) {
// Implementation
}

问题是我试图传递一个从 Message 扩展的 Java 类,例如:

doSomethingWithType(Int32::class.java)

但这给了我以下编译器错误:

Expected type mismatch: 
required: Class<Message>
found: Class<Int32>

为什么这不起作用?我应该如何解决它?

最佳答案

以下是有效的 Kotlin 代码(假设 DogAnimal 的子类):

val listOfDogs: List<Dog> = listOf(dog1, dog2)
val listOfAnimals: List<Animal> = listOfDogs

这背后的原因是List是一个 Kotlin 接口(interface),定义为:

public interface List<out E> : Collection<E>

遗憾的是,您无法在纯 Java 中执行相同的操作,但您可以这样做:

List<Dog> listOfDogs = new ArrayList<>();
List<? extends Animal> listOfAnimals = listOfDogs;

现在,doSomethingWithType预计 Class<Message>当您提供Class<Int32>时,和ClassT 中不协变。为了使该代码编译,您可以执行以下操作:

fun doSomethingWithType(type: Class<out Message>) { ... }
doSomethingWithType(Int32::class.java)

只要你只拉出T,这就会起作用。来自Class<T> ,即Class只会产生类型 T .

关于java - Java 类定义的类型推断失败。我该如何解决这个问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55811569/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com