如何使List <>的kotlin函数可从Java调用

时间:2018-07-25 21:26:23

标签: 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 */ }


    }

1 个答案:

答案 0 :(得分:3)

代替

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

您应该使用:

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