我试图得到一个类,它结合了< code>Kotlin中的列表、集合和映射。我希望编写< code>isScalar函数,如果对象只包含一个元素,它应该返回< code>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
据我所知,这与多线程假设有关。在Java,如果期望多线程,我会使函数同步
。此外,如果我不编写线程安全的,我可以完全忽略这一点。
静态编程语言应该怎么写?
我看到了这个解决方案https://stackoverflow.com/a/44596284/258483但它期望MT,这是我不想的。如果它做不到,如何避免智能铸造?
更新
问题是如何以同样的“程序性”形式做到这一点。如何不用智能铸造?
更新2
总之,据我所知,在Kotlin中显式比较variable和< code>null是完全不可能/不合理的。因为一旦你比较了它,下一次你应该用像< code >这样的操作再一次隐式地比较它和< code>null。?这是无法避免的。
在给定的行中,我也遇到了同样的问题
sliderView.setSliderAdapter(adapter!!)
sliderView.setIndicatorAnimation(IndicatorAnimationType.WORM)
最后,通过添加解决错误!!
sliderView!!.setSliderAdapter(adapter!!)
sliderView!!.setIndicatorAnimation(IndicatorAnimationType.WORM)
您可以执行空检查,如果成功,使用let
访问变量的只读副本:
fun isScalar() : Boolean {
return list?.let { it.size == 1 } ?: false
}
list
为 null,则整个 let
表达式的计算结果将为 null
,并且将返回 Elvis 运算符 (false
) 的右侧。list
不为 null,则调用 let
函数,并返回 it.size == 1
表达式的结果 - 它
引用 let
被调用的对象(在本例中为 list
)。由于它与安全调用一起使用,因此它将
具有不可为 null 的类型,并且可以在其上调用大小
。如果您利用了<code>null</code>不能等于<code>1</code>(或任何其他事实),您可以使此检查非常简洁:
fun isScalar() : Boolean =
list?.size == 1
当对list.size
的空安全调用返回null时,我们会得到false
,因为1!=null
。否则,将比较返回的任何值size
,这与您预期的一样。
通过使用空安全操作符(< code >?)您完全避免了智能转换。Kotlin为我们提供了使代码更干净的智能转换,这是它保护我们免于误用该特性的方法之一。Kotlin不会保护我们不受任何伤害(例如,被零除,你在注释中使用的例子)。您的代码陷入了智能类型转换可能出错的合理情况,因此Kotlin加入了帮助。
但是,如果您绝对确定没有其他线程在工作,那么是的,此检查是“错误的”。在这种情况下,您不需要警告。从kotlinlang.org上的这个线程判断,你不是唯一一个!
我正在尝试获得一个类,它在中组合了list、set和map。我希望编写函数,如果对象只包含一个元素,则该函数应该返回 不幸的是它给了我错误的比较 说 更新2 总结一下,就我的理解,在Kotlin中显式地将variable与进行比较是不可能/不合理的。因为一旦你比较它,下一次你就必须再次用隐式地用类似这样的操作来比较它,而你无法避免这种情况。
我正在用kotlin为android制作一个小型tasker。我将主要活动分成一些片段,然后为每个片段创建一个视图模型。但是现在这里出现了一个问题。 下面是一些代码: 我本来希望在observer方法的帮助下在主屏幕上看到一些创建的单选按钮,但是我得到了一个例外,这在问题的标题中提到。提前感谢您的帮助!
智能转换为“GridLayoutManager”是不可能的,因为“ViewManager”是一个可变属性,此时可能已更改 是错误,AndroidStudio显示时,试图添加一个除法器到我的回收视图。 PixelsFragment.kt 我找到了这个答案,它说这样的问题可能是因为在执行该行时变量可能碰巧为< code>null,然后他们提供了3个解决方案。然而,根据我的理解,< code>viewM
我尝试将我的代码从java转换为kotlin,因此我面临这个错误。我不明白为什么我会得到这个错误 错误 我只是附加给我一个错误的代码并突出显示它
我还在另一个类中使用了bitmap2和Bitmap1: 这里写着:类型不匹配,必需:位图找到:位图?
我知道是可变变量,但我显式检查了并且是类型,那么为什么不能智能转换为该类型呢? 我怎样才能把它修好呢?