java - 如何使带有 List<> 的 kotlin 函数可从 Java 调用

标签 java android arraylist kotlin

在 kotlin 中,MyClass 具有 List 成员,并且构建器具有获取 List 的函数。

但在 Java 代码中,当它调用构建器的 fun dataList(dataList: List<Data>) 时它得到编译器错误有关

List<> cannot be applied to ArrayList<>

从反编译的代码中可以看出列表的类型为 kotlin.collections.List<>

如何使 List<> 的函数可以从 Java 中调用?

data class MyClass( 
    val context: Context,
    val dataList: List<Data> = emptyList<Data>(),
) {

    private constructor(builder: Builder) : this(builder.context, builder.dataList)

    class Builder {
        private var context: Context? = null
        private var dataList: List<Data> = emptyList<Data>()

        fun context(context: Context) = apply { this.context = context }
        fun dataList(dataList: List<Data>) = apply { this.dataList = dataList }

        fun build() = MyClass(this)
    }
}

JAVA

ArrayList<Data> theDataList = new ArrayList<Data>();
theDataList.add(new Data())

MyClass myClass = new MyClass.Builder()
            .context(appContext)
            .dataList(theDataList)  //<== error
            .build();

错误是:

dataList(Java.util.List<com.model.Data>)  in Builder  cannot be applied to dataList(Java.util.ArrayList<com.model.Data>)

在Java代码中,如果单击dataList(),它会打开反编译的代码,如下所示,并且似乎会提示

fun dataList(dataList: kotlin.collections.List<com.model.Data>) :

public final data class Data public constructor(context: android.content.Context, 
         dataList: kotlin.collections.List<com.model.Data> /* = compiled code */) {

    public final val context: android.content.Context /* compiled code */
    public final val dataList: kotlin.collections.List<com.model.Data> /* compiled code */

    public final operator fun component1(): android.content.Context { /* compiled code */ }
    public final operator fun component2(): kotlin.collections.List<com.model.Data> { /* compiled code */ }


    public final class Builder public constructor() {

       private final var context: android.content.Context? /* compiled code */
       private final var dataList: kotlin.collections.List<com.model.Data> /* compiled code */

       ... ...
       public final fun dataList(dataList: kotlin.collections.List<com.model.Data>): com.model.MyClass.Builder { /* compiled code */ }

       ... ...
       public final fun build(): com.model.Data { /* compiled code */ }


    }

最佳答案

而不是

ArrayList<Data> theDataList = new ArrayList<Data>();

你应该使用:

List<Data> theDataList = new ArrayList<Data>();

关于java - 如何使带有 List<> 的 kotlin 函数可从 Java 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51527902/

相关文章:

java - 为什么这段代码强制退出?

java - 如何将 Google 日历链接到应用程序?

java - 将 servlet-war 部署到 oc4j 容器中

android - BX LR 和 ARM 从异常指令返回(RFE 和 ERET)

java - 如何打印数组列表中的每个对象并正确计算它们的数量?

java - 尝试理解泛型

java - 如何在单独的 Spring 集成应用程序中实现 JMS 入站和出站配置?

android - layout_centerHorizo​​ntal 当另一个 View 位于其右侧时项目不居中

Android:如何避免 Activity 被系统杀死,ActivityManager:处理我的包名称(pid 935)已死亡

java - 在 Android 中使用蓝牙在 2 个设备之间发送数据