首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么“返回”可以返回一个“返回”在科特林?

为什么“返回”可以返回一个“返回”在科特林?
EN

Stack Overflow用户
提问于 2018-01-17 21:17:43
回答 2查看 2.8K关注 0票数 15

这个问题听起来可能很傻,但里面没有错误。

代码语言:javascript
复制
fun test(): Any {
    return return true
}

这在科特林是可能的。尽管编译器警告

不可达码

为了外面的回归。但这只是个警告。

我不想将Java与Kotlin进行比较,但我感兴趣的是,这种方法在Java中是否同样有效。

代码语言:javascript
复制
public class Test {
  // ...
  static int test() {
    return return 1;
  }
}

不是的!

/Test.java:8:错误:表达式的非法开始 (二)回报1; 自愿性 /Test.java:8:错误:不是语句 (二)回报1; /T1582-1995商品商品的商品、商品、商品等 2个错误

为什么Kotlin是这样设计的?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-17 21:25:58

return是Kotlin中的表达式,其返回类型为Nothing,该类型充当所有其他类型的子类型。例如,这使您能够以一种类型安全的方式执行此操作,而无需额外的null检查行:

代码语言:javascript
复制
fun getInt(): Int? = ...

fun printInt() {
    val int: Int = getInt() ?: return
    println(int)
}

在这里,getInt() ?: return的类型可以是Int,因为这是猫王操作符两边最常见的超级类型,因为NothingInt的一个子类型。

同样的情况也适用于throw,您也可以将它与Elvis操作符巧妙地结合使用,以表明您希望取消对null值的执行,而不必担心以后的类型。

这导致了一种奇怪的情况,比如

代码语言:javascript
复制
fun x(): Int {
    return return throw return throw throw return 0
}

是有效的语法,因为Nothing类型使每个表达式从右到左有效读取。实际上,正如编译器所警告的那样,return 0将执行,其余的代码将永远无法到达。

票数 20
EN

Stack Overflow用户

发布于 2018-01-17 21:21:46

因为return语句是一个返回Nothing的表达式。因此,还汇编了下列文件:

代码语言:javascript
复制
fun main(args: Array<String>) {
    val r = return
}

这是在文档中说的

Kotlin有三个结构跳跃表达式:

  • return。默认情况下,从最近的封闭函数或匿名函数返回。..。

所有这些表达式都可以用作较大表达式的一部分:

val = person.name ?:返回

这些表达式的类型是Nothing类型。

因为Nothing是任何其他类型的子类型,所以它有能力做出奇怪的陈述,就像你问题中的那个,尽管它们看起来是非常错误的……

实际上,在KotlinConf上有一个有趣的演讲,看一看有趣的事情,如下所示:

代码语言:javascript
复制
fun getText(): String {
  val s = return throw return "Hello"
}

println(getText())
//prints "Hello"
票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48310136

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档