我在学习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表达式中,T
是curFrag
,类型是片段
是。
T(curFrag)
可以被它
取代。
但是当我使用
curFrag
而不是它
时,IDE显示一条错误消息。
后来我查< code>it
的类型,是< code>Fragment?它不是< code >片段类型。
老实说,我不太明白。
我不知道为什么它是自动的智能转换
,应该只用于不可变变量
。
let
函数基本上创建了一个与您调用它的值相同的新变量,因此它并不是真正的智能转换原始属性。
如果您使用 ?.let
,如果值为 null,甚至不调用 let
。安全调用意味着接收器 let
被调用不是一个可为 null 的值,因为否则 let
根本不会被调用。里面的它只是
对它所调用内容的引用。
实际上,尽管它在概念上类似于智能铸造。实际上没有办法编写等效的Kotlin代码来做什么?let
正在做,因为 ?.
安全呼叫是一个没有扩展形式的特殊运算符。
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