当前位置: 首页 > 知识库问答 >
问题:

“它”是内部自动智能投射吗?[复制]

公良理
2023-03-14

我在学习Android,我也在学习Kotlin。

在编写Android代码时,我对在<code>let</code>函数中使用<code>it</code>感到好奇。

MainActivity.kt

class MainActivity : AppCompatActivity() {
    private var curFrag: Fragment? = null
    curFrag = fm.primaryNavigationFragment

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

//      curFrag?.let { transaction.hide(curFrag) } // error.
        curFrag?.let { transaction.hide(it) }

    }
}

错误

Smart cast to 'Fragment' is impossible, because 'curFrag' is a mutable property that could have been changed by this time

let()的lambda表达式中,TcurFrag,类型是片段 是。

T(curFrag)可以被取代。

但是当我使用curFrag而不是时,IDE显示一条错误消息

后来我查< code>it的类型,是< code>Fragment?它不是< code >片段类型。

老实说,我不太明白。

我不知道为什么它是自动的智能转换,应该只用于不可变变量

共有2个答案

汤博
2023-03-14

let函数基本上创建了一个与您调用它的值相同的新变量,因此它并不是真正的智能转换原始属性。

如果您使用 ?.let,如果值为 null,甚至不调用 let。安全调用意味着接收器 let 被调用不是一个可为 null 的值,因为否则 let 根本不会被调用。里面的它只是对它所调用内容的引用。

实际上,尽管它在概念上类似于智能铸造。实际上没有办法编写等效的Kotlin代码来做什么?let 正在做,因为 ?. 安全呼叫是一个没有扩展形式的特殊运算符。

尉迟栋
2023-03-14

Kotlin 是一种空安全语言,它试图从代码中消除所有可能的空引用。您可以对变量执行可空性检查,然后可以像这样使用它

if(curfrag != null) { transaction.hide(curFrag)

只有当变量<code>curfrag

但是安全调用<代码>?带< code>let总是给我们不可空的结果,什么Safe调用运算符< code >?执行的是,只有当变量不是-null时,它才执行其后的任何操作,否则它返回null。

它适用于所有可变类型或成员 var,它检查一次 null,然后提供结果。如果值为非空值,它将执行定义的操作,否则将跳过它。指的是该非空值的副本。

所以当你这么做的时候

curFrag?. let{transaction.hide(curFrag)}

curFrag可以为null,因为您直接传递的是一个可为null的值。

但在这种情况下

curFrag?.let { transaction.hide(it) }

它仅在非空值时传递值。

 类似资料:
  • 我在kotlin中实现了一个LinkedList,并编写了一个方法从中删除重复项: 在最后两行: (在addNodeToTail方法中),编译器表示由于复杂的表达式,智能转换是不可能的。我必须添加非空断言调用(!!)。 我想了解为什么这个解决方案不被接受,尽管while表达式检查该节点。next不为空。我想知道是否有比使用非空断言调用更好的解决方案(!!)。 感谢您的帮助

  • 我尝试运行以下代码,但代码无法通过编译,我得到错误: 智能强制转换为“Long”是不可能的,因为“I”是一个可变属性,可能已经被更改了 为什么? 我用Java写的代码MyClass2,它能很好的工作,为什么?

  • 我得到一个空指针异常,而自动布线我的类之一。 我尝试过使用不同的注释,比如和 Stacktrace:

  • 我是实现REST API服务的新手。我尝试了简单的资源来实现。不幸的是,我坚持这个例外。我在谷歌上搜索并尝试了许多选项,但运气不好。我不确定哪里做错了。请帮帮我。 创建了一个动态Web项目“JersyJson” 创建了名为-JSONService的资源。java(源代码来自google) 创建了JavaBean类-Track。java(源代码来自google) 将项目转换为Maven项目 已创建应

  • 因为之前微软推出了typescript语言,结合tsd文件,用visual studio写typescript代码是相当爽的,智能提示的功能非常nb。 这个功能理所应当也被vsc继承了。 vsc的自动补全用的是typings。 The TypeScript Definition Manager(之前的tsd已经弃用了,faq里有说明) https://github.com/typings/typi

  • 以下是异常日志: 下面是android.app.ContextImpl.GetSharedReferences异常抛出的代码 让我们假设日志信息是正确的,它应该几乎是正确的。 我的第一个问题是:在文件的第358行抛出强制转换异常ContextImpl.java什么意思?那里只有一个右括号。 我猜第358行下面的语句是异常的根本原因 因为sp被声明为SharedReferencesImpl,并且当g