为什么用类似的代码在Java中编译对put()的调用在Kotlin中无法编译

Alb*_*rtB 3 java kotlin

我在Java中具有以下功能,需要将其转换为Kotlin。

@Override
public void afterTextChanged(Editable s) {

    if (s != null && !"".equals(s.toString())) {
        int position = (Integer) mHolder.numEdit.getTag();
        // Saved to the data variable when the data changes
        mData.get(position).put("list_item_inputvalue",
                s.toString());
    }
}
Run Code Online (Sandbox Code Playgroud)

这是我创建的等效Kotlin代码:

override fun afterTextChanged(s: Editable?) {

    if (s != null && "" != s.toString()) {
        val position = mHolder.numEdit!!.tag as Int
        // Saved to the data variable when the data changes
        mData?.get(position).put("list_item_inputvalue", s.toString())
    }
}
Run Code Online (Sandbox Code Playgroud)

编译器不喜欢对的调用.put()。Java中的变量mData为:

private List<Map<String, String>> mData;
Run Code Online (Sandbox Code Playgroud)

和科特林:

var mData: List<Map<String, String>>? = null
Run Code Online (Sandbox Code Playgroud)

为什么编译器不喜欢putKotlin中的转换?

更新:

println(mData) = [{list_item_inputvalue=0}, {list_item_inputvalue=1},...]

println(mData?.get(position)) = {list_item_inputvalue=8}

错误

Java代码

Ste*_*eve 8

您的问题围绕您的问题中的这一陈述:

var mData: List<Map<String, String>>? = null
Run Code Online (Sandbox Code Playgroud)

在Kotlin中,Map类型是不可变的,因此没有.put()方法。这就是您遇到的问题。要解决此问题,只需将此语句更改为:

var mData: List<MutableMap<String, String>>? = null
Run Code Online (Sandbox Code Playgroud)

一秒 '?' 在之后是必需的,mData?.get(position)因为该语句将返回nullif mData == null。也就是说,MutableMap<String, String>?即使.put()by本身返回的类型,该语句也将返回的类型MutableMap<String, String>

总而言之...如果创建可变映射列表,则编译器将对以下语句感到满意:

mData?.get(position)?.put("list_item_inputvalue", s.toString())
Run Code Online (Sandbox Code Playgroud)