【问题标题】:Kotlin unresolved reference :add after converting from Java codeKotlin 未解决的参考:从 Java 代码转换后添加
【发布时间】:2017-10-20 13:50:14
【问题描述】:

我的 java 代码如下所示:

    public static <KEY, VALUE> Map<KEY, List<VALUE>> createMultimap(@NonNull Collection<VALUE> values, @NonNull TransformFunction<VALUE, KEY> transformFunction) {
    Map<KEY, List<VALUE>> tmpMap = new HashMap<>();
    for (VALUE value : values) {
        if (value != null) {
            KEY key = transformFunction.transform(value);
            List<VALUE> valuesList = tmpMap.get(key);
            if (valuesList == null) {
                valuesList = new ArrayList<>();
                tmpMap.put(key, valuesList);
            }
            valuesList.add(value);
        }
    }
    return Collections.unmodifiableMap(tmpMap);
}

我使用 Android Studio 选项“转换为 Kotlin”对其进行了转换

如下图:

    fun <KEY, VALUE> createMultimap(values: Collection<VALUE>, transformFunction: TransformFunction<VALUE, KEY>): Map<KEY, List<VALUE>> {
    val tmpMap = HashMap<KEY, List<VALUE>>()
    for (value in values) {
        if (value != null) {
            val key = transformFunction.transform(value)
            var valuesList: List<VALUE>? = tmpMap[key]
            if (valuesList == null) {
                valuesList = ArrayList()
                tmpMap.put(key, valuesList)
            }
            valuesList.add(value)

        }
    }
    return Collections.unmodifiableMap(tmpMap)
}

IDE 现在在此处强调“添加”方法:

valuesList.add(value)

上面写着:

未解决的参考:添加

我该如何解决这个问题?

更新:

这是我的变换函数:

    interface TransformFunction<VALUE, RESULT> {
    fun transform(value: VALUE?): RESULT
}

示例用法:

    private fun getRSSIMultimap(rssiEvents: Collection<LocationRSSIEvent>): Map<NexoIdentifier, List<LocationRSSIEvent>> {
    return CollectionsUtils.createMultimap(rssiEvents, object : CollectionsUtils.TransformFunction<LocationRSSIEvent, NexoIdentifier> {
        override fun transform(locationRSSIEvent: LocationRSSIEvent): NexoIdentifier {
            return locationRSSIEvent.nexoIdentifier
        }
    })
}

【问题讨论】:

    标签: java kotlin


    【解决方案1】:

    由于您将 List 分配给您的 valuesList,它不知道 add()。

    改成

     fun <KEY, VALUE> createMultimap(values: Collection<VALUE>, transformFunction: TransformFunction<VALUE, KEY>): Map<KEY, ArrayList<VALUE>> {
     var valuesList: ArrayList<VALUE>? = tmpMap[key]
    

    最好使用 Kotlins MutableList,它目前与 Java 的 ArrayList 相同,但在以后的版本中可能会更改为原生方法。

     fun <KEY, VALUE> createMultimap(values: Collection<VALUE>, transformFunction: TransformFunction<VALUE, KEY>): Map<KEY, MutableList<VALUE>> {
        val tmpMap = HashMap<KEY, MutableList<VALUE>>()
        for (value in values) {
            if (value != null) {
                val key = transformFunction.transform(value)
                var valuesList: MutableList<VALUE>? = tmpMap[key]
                if (valuesList == null) {
                    valuesList = mutableListOf()
                    tmpMap.put(key, valuesList)
                }
                valuesList.add(value)
    
            }
        }
        return Collections.unmodifiableMap(tmpMap)
    }
    

    【讨论】:

    • 对不起,但它仍然强调了“添加”方法。我正在使用 Android Studio 3.0。也许你可以检查一下?
    • 请添加您的 TransformFunction。它可以用高阶函数代替。更新了代码。现在工作。
    • 欢迎您。我强烈建议您查看kotlinlang.org/docs/reference/lambdas.html,因为 Kotlin 中不使用接口。
    • 谢谢,我还在努力学习,但时间不多,我重构了Java代码:)
    • 你能再看看我更新的问题吗?我更新了示例用法 - 它强调了“对象”属性,而“覆盖”没有覆盖任何内容
    猜你喜欢
    • 2021-01-29
    • 1970-01-01
    • 2018-10-25
    • 1970-01-01
    • 1970-01-01
    • 2021-10-29
    • 2018-10-16
    • 2023-03-25
    • 1970-01-01
    相关资源
    最近更新 更多