我正在尝试获得一个类,它在kotlin
中组合了list、set和map。我希望编写isScalar
函数,如果对象只包含一个元素,则该函数应该返回true
import it.unimi.dsi.fastutil.objects.Reference2ReferenceOpenHashMap
import it.unimi.dsi.fastutil.objects.ReferenceArrayList
import it.unimi.dsi.fastutil.objects.ReferenceOpenHashSet
class Args {
var list : ReferenceArrayList<M>? = null
var set : ReferenceOpenHashSet<M>? = null
var map : Reference2ReferenceOpenHashMap<M, M>? = null
fun isEmpty() : Boolean {
return list === null && set === null && map === null
}
fun isScalar() : Boolean {
if(list !== null && list.size == 1) {
return true
}
}
}
不幸的是它给了我错误的比较
list !== null && list.size == 1
说
Smart cast to 'ReferenceArrayList<M>' is impossible, because 'list' is a mutable property that could have been changed by this time
更新2
总结一下,就我的理解,在Kotlin中显式地将variable与null
进行比较是不可能/不合理的。因为一旦你比较它,下一次你就必须再次用null
隐式地用类似.?
这样的操作来比较它,而你无法避免这种情况。
如果您利用null
不能等于1
(或者其他任何东西,真的)这一事实,则可以使此检查非常简洁:
fun isScalar() : Boolean =
list?.size == 1
当对list.size
的null安全调用返回null时,我们将得到false
,因为1!=null
。否则,将对size
返回的任何值进行比较,这将按照您的预期工作。
通过使用null safe运算符(?.
),您可以完全避免智能强制转换。Kotlin为我们提供了聪明的转换来使代码更清晰,这也是它保护我们不被误用的方法之一。Kotlin不会保护我们免受一切(除以零,例如,在注释中使用的例子)。您的代码正陷入一个智能转换可能出错的合法案例中,因此Kotlin跳了进来提供帮助。
我试图得到一个类,它结合了< code>Kotlin中的列表、集合和映射。我希望编写< code>isScalar函数,如果对象只包含一个元素,它应该返回< code>true 不幸的是,相比之下,它给了我一个错误 说着 据我所知,这与多线程假设有关。在Java,如果期望多线程,我会使函数。此外,如果我不编写线程安全的,我可以完全忽略这一点。 静态编程语言应该怎么写? 我看到了这个解决方案http
所以我最近开始学习Kotlin,我正在学习Java语言的Android Studio教程。我最终使用Android Studio将Java文件转换为Kotlin。 如何修复此错误?
我还在另一个类中使用了bitmap2和Bitmap1: 这里写着:类型不匹配,必需:位图找到:位图?
我知道是可变变量,但我显式检查了并且是类型,那么为什么不能智能转换为该类型呢? 我怎样才能把它修好呢?
我正在用kotlin为android制作一个小型tasker。我将主要活动分成一些片段,然后为每个片段创建一个视图模型。但是现在这里出现了一个问题。 下面是一些代码: 我本来希望在observer方法的帮助下在主屏幕上看到一些创建的单选按钮,但是我得到了一个例外,这在问题的标题中提到。提前感谢您的帮助!
“智能强制转换为”GridLayoutManager“是不可能的,因为”ViewManager“是一个可变属性,此时可能已发生更改。” 是AndroidStudio在尝试向RecolyerView添加分隔符时显示的错误。