Tag: 可选

在地图中使用可选

好的,在我开始解释我的问题之前,我希望你知道我知道背后的设计思想,它不打算在字段或集合中使用,但我已经在Kotlin中编程了很多,真的不喜欢使用null 。 所以我有一个类似于虚幻引擎的基于节点的编辑器 ,每个节点都有ConnectionBox es,它们可以是空闲的,或者被Connection占用。 所以有不同的方法来表达这个使用映射每个ConnectionBox到一个Connection地图: Map<ConnectionBox, Connection> connectionEndPoints; 如果ConnectionBox是空闲的,则Connection可以为null 。 我不喜欢这样,因为其他开发人员不知道这个Map的功能,并且它可能会返回null现有的ConnectionBox 。 所以我很想用一个: Map<ConnectionBox, Optional<Connection>> connectionEndPoints; 显示打算更好,你甚至可以读取它像: “这个ConnectionBox可能ConnectionBox了一个Connection 。” 我的问题是:为什么我不应该这样做,尽管它显示的意图要清楚得多,并且阻止了NPE 。 每个SO-thread和每个博客文章都说这是不好的风格,甚至编译器都说我不应该这样做。 根据要求,这是一个SO线程,不鼓励使用Optional作为字段或集合值: 用于可选 这里是警告(事实证明这是来自IntelliJ的警告): 警告:可选用作字段{fieldName}的类型 确定后,建议Connection参考应该在ConnectioBox的问题只是转移。 为什么是: class ConnectionBox { Optional<Connection> connection; … 比…更差 class ConnectionBox { Connection connection; //may be null … 除非我发表评论,否则你不能看到你可能遇到NPE ,我不喜欢解释代码的评论,可以解释自己。

价值虚构之后,智能投射到“布尔”是不可能的

第二个println错误: 智能投射到'布尔'是不可能的,因为'r.isSquare'是一个可变的属性,可以在这个时候改变 fun main(args: Array<String>) { val r: Rectangle = Rectangle(5,5) println(r.isSquare) r.isSquare = true println(r.isSquare) // error but works with println(r.isSquare?:false) } data class Rectangle(var height: Int, var width: Int){ var isSquare: Boolean? = null } 如果它是空的,它会像第一个println一样打印null,为什么我必须这样做呢? 编辑2 感谢所有的答案,我现在明白了:首先是println println(message: Any?) 第二个println是 println(message: Boolean) 因为r.isSquare = true使编译器信任isSquare是布尔,不再是布尔? EDIT2 这里是我如何处理编译器来保持信任isSquare是布尔? fun main(args: Array<String>) { val […]

Kotlin在Swift中有一个相当于隐式展开的可选项吗?

隐式解包选项是Swift的一个非常有用的特性,例如在类的构造函数中没有赋值的UI元素,但是对于大多数函数可以安全地假定它们是非空的(因为它们将被分配在viewDidLoad中) 。 例如。 @IBOutlet weak var textView : UITextView! 是否有相当于Kotlin,或解决方法达到相同的效果?

如何映射java.util.Optional <Something>到某些东西? 在Kotlin

我有一个方法返回java.util.Optional<Something> 。 我想从Kotlin中使用这种方法,而且我希望我的结果是Something? ,而不是Optional<Something> 如何在科特林,用惯用的方式做到这一点? 调用.orElse(null) on Optional给了我Something? 的确,但是看起来不太好。 Kotlin不会抱怨,如果我写val msg: Something = optional.orElse(null). ( msg被声明为Something ,而不是Something? – 我松散的编译类型检查)。 我使用Kotlin 1.0.3