代码之家  ›  专栏  ›  技术社区  ›  HelloCW

为什么我可以把一个空参数传递给一个在Kotlin中需要非空参数的乐趣?

  •  2
  • HelloCW  · 技术社区  · 6 年前

    乐趣 findLast 会回来的 MDetail? ,所以 var aa 可能是空的。

    乐趣 remove 接受一个非空参数,但是为什么代码 listofMDetail.remove(aa) 被编译?谢谢!

    而且,代码A可以正常运行!

    代码A

    private val listofMDetail:MutableList<MDetail> = myGson.fromJson<MutableList<MDetail>>(mJson)
    
    fun deleteDetailByID(_id:Long){
        var aa=listofMDetail.findLast { it._id == _id };
    
        //listofMDetail.remove(null)  //It doesn't work     
        listofMDetail.remove(aa)      // It can be compiled
    
        var bb: MDetail?=null
        listofMDetail.remove(bb)      // It can be compiled
    
    }
    

    源代码

    public interface MutableList<E> : List<E>, MutableCollection<E> {
        // Modification Operations
        override fun add(element: E): Boolean
    
        override fun remove(element: E): Boolean
    
       ...........
    }
    
    1 回复  |  直到 6 年前
        1
  •  4
  •   Hong Duan    6 年前

    在你的代码中, aa bb 两者都是类型 MDetail? 但是 null 值本身不包含有关类型的信息,因此编译器无法为您推断类型,这是一个编译错误,但是如果您将 无效的 M细节? ,然后它也将被编译:

    listofMDetail.remove(null as MDetail?)
    

    那么问题是,为什么 remove 当您的 listofMDetail 声明为 MutableList<MDetail> 没有 ? 之后 MDetail .

    那是因为 去除 方法未解析为 public interface MutableList<E> 但是 MutableCollections.kt 去除 ,代码如下:

    package kotlin.collections
    
    /**
     * Removes a single instance of the specified element from this
     * collection, if it is present.
     *
     * Allows to overcome type-safety restriction of `remove` that requires to pass an element of type `E`.
     *
     * @return `true` if the element has been successfully removed; `false` if it was not present in the collection.
     */
    @kotlin.internal.InlineOnly
    public inline fun <@kotlin.internal.OnlyInputTypes T> MutableCollection<out T>.remove(element: T): Boolean
            = @Suppress("UNCHECKED_CAST") (this as MutableCollection<T>).remove(element)
    

    在您的例子中,泛型类型t是 M细节? 美迪泰 out T ,所以 去除 将接收类型为的参数 M细节? ,允许 无效的 价值。