这个问题听起来可能很傻,但里面没有错误。
fun test(): Any {
return return true
}这在科特林是可能的。尽管编译器警告
不可达码
为了外面的回归。但这只是个警告。
我不想将Java与Kotlin进行比较,但我感兴趣的是,这种方法在Java中是否同样有效。
public class Test {
// ...
static int test() {
return return 1;
}
}不是的!
/Test.java:8:错误:表达式的非法开始 (二)回报1; 自愿性 /Test.java:8:错误:不是语句 (二)回报1; /T1582-1995商品商品的商品、商品、商品等 2个错误
为什么Kotlin是这样设计的?
发布于 2018-01-17 21:25:58
return是Kotlin中的表达式,其返回类型为Nothing,该类型充当所有其他类型的子类型。例如,这使您能够以一种类型安全的方式执行此操作,而无需额外的null检查行:
fun getInt(): Int? = ...
fun printInt() {
val int: Int = getInt() ?: return
println(int)
}在这里,getInt() ?: return的类型可以是Int,因为这是猫王操作符两边最常见的超级类型,因为Nothing是Int的一个子类型。
同样的情况也适用于throw,您也可以将它与Elvis操作符巧妙地结合使用,以表明您希望取消对null值的执行,而不必担心以后的类型。
这导致了一种奇怪的情况,比如
fun x(): Int {
return return throw return throw throw return 0
}是有效的语法,因为Nothing类型使每个表达式从右到左有效读取。实际上,正如编译器所警告的那样,return 0将执行,其余的代码将永远无法到达。
发布于 2018-01-17 21:21:46
因为return语句是一个返回Nothing的表达式。因此,还汇编了下列文件:
fun main(args: Array<String>) {
val r = return
}这是在文档中说的
Kotlin有三个结构跳跃表达式:
return。默认情况下,从最近的封闭函数或匿名函数返回。..。所有这些表达式都可以用作较大表达式的一部分:
val = person.name ?:返回
这些表达式的类型是Nothing类型。
因为Nothing是任何其他类型的子类型,所以它有能力做出奇怪的陈述,就像你问题中的那个,尽管它们看起来是非常错误的……
实际上,在KotlinConf上有一个有趣的演讲,看一看有趣的事情,如下所示:
fun getText(): String {
val s = return throw return "Hello"
}
println(getText())
//prints "Hello"https://stackoverflow.com/questions/48310136
复制相似问题