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

为什么不在智能强制转换中使用check()、require()和assert()结果?

黎玺
2023-03-14

考虑以下代码片段:

object C {
    @JvmStatic
    fun main(vararg args: String) {
        val s: String? = null
        check(s != null) {
            "The string is null"
        }
        require(s != null) {
            "The string is null"
        }
        assert(s != null) {
            "The string is null"
        }
        s.length
    }
}

check()require()都有

contract {
    returns() implies value
}

在它们的主体中,上面的代码仍然没有编译,这迫使我使用

s?.length

或者

s!!.length

为什么在上述代码中不执行智能强制转换?


共有1个答案

丰飞龙
2023-03-14

不久前,我回答了一个有关assertrequire之间区别的问题。TL;DR:assert不一定会引发异常,但require是。在1.3中,它还使用契约,这意味着如果方法返回,编译器知道该语句是正确的,如果适用,它可以应用智能转换。

这解释了为什么assert执行此操作;从断言返回并不意味着该语句为true。对于您所拥有的代码,除非ea为true,否则不会引发异常。断言不会触发智能强制转换,即使使用1.3。

checkrequire都会触发1.3及以上版本的智能强制转换(因为契约),assert不会(没有契约,也不能保证如果条件失败,它实际上会引发异常)。

我在Kotlin论坛上找到了这篇帖子,问你到底是什么。联系人已经存在了很长一段时间,但这篇帖子也支持了我最初的假设:虽然联系人存在,但他们还没有准备好。正如第二篇文章提到的,实际上是残疾的。这就是为什么smart cast不起作用。

然而,在静态编程语言1.3中,合约被释放了。如果你升级,你会看到它确实有效(至少对我来说是这样)。

1.3-M2中添加了完整的合同支持,这是1.3的预发布版本。

 类似资料:
  • 问题内容: 执行此强制转换时出现编译错误: 应该被继承,尽管不能直接继承。 从文档: 农具其中inturn & 为什么这无效? 也感谢您提供有关使用as 的正确方法的意见? 我正在考虑包装方法。 问题答案: 扩展,并且 不 扩展。 如果您想从中获得帮助,我认为实现包装器类是您最简单的选择。幸运的是的唯一抽象方法是。 RandomAccessFile实现了DataInput,该数据输入将依次转为Da

  • 问题内容: 所以这工作: 但这不是: 总而言之,我得到了第一部分(拳击),但是我发现第二部分不起作用是非常不直观的。是否有特定的原因(除了String从Object继承而int不从Object继承)? 编辑: 为了完善我的问题,这也可以: 但是,以下内容却没有: 令人惊讶的是,您遇到了与String相同的问题: 在最后一行产生类强制转换异常。仍然有效: 问题答案: 我刚刚找到了我正在寻找自己的答案

  • 我还没有看到这个问题,这让我很惊讶。 以下内容不会编译: 然而,将此更改为强制转换对象并将其引用存储在条件语句之外的新对象中,可以解决此问题: 我的问题是,为什么Java中不允许这种行为?(特别是Java 5) 编辑:啊哈!谢谢大家。该死的现代IDE给出了模糊的错误消息。我已经开始打折了,这一次对我没有任何好处。(Netbeans警告我缺少括号和分号…)

  • 我将值放入hashmap中, 我想通过使用map的方法创建一个列表。 但它允许我将其传递给列表的创建:

  • 问题内容: 我有。我想使用获得最大结果。这是我的代码: 这是我的: 现在我得到了。怎么了? 问题答案: 您的错误可能在以下行中: 其中query.list()返回BigInteger列表而不是Long列表。尝试将其更改为。