Kotlin 未解析参考:从 Java 代码转换后添加

K.O*_*.Os 6 java kotlin

我有看起来像这样的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);
}
Run Code Online (Sandbox Code Playgroud)

我使用 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)
}
Run Code Online (Sandbox Code Playgroud)

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

valuesList.add(value)
Run Code Online (Sandbox Code Playgroud)

它说:

未解决的参考:添加

我怎样才能解决这个问题?

更新:

这是我的变换函数:

    interface TransformFunction<VALUE, RESULT> {
    fun transform(value: VALUE?): RESULT
}
Run Code Online (Sandbox Code Playgroud)

示例用法:

    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
        }
    })
}
Run Code Online (Sandbox Code Playgroud)

Ema*_*l S 5

由于您将 List<> 分配给 valuesList,因此它不知道 add()。

将其更改为

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

最好使用 Kotlins MutableList,它目前与 Javas 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)
}
Run Code Online (Sandbox Code Playgroud)