val a=10; val b=if(a==5) println("hello") else (1,"hi")
在這種情況下將推斷回傳型別是什么?如何?
uj5u.com熱心網友回復:
大概您要的是 的型別b,在這種情況下是Any.
if (a == 5) println("hello") else (1, "hi")
輸入如下:
對于
if運算式,型別是兩個可能分支的最小上界:如果后續運算式(println("hello")在這種情況下)具有 typeA并且替代運算式 ((1, "hi")) 具有 typeB,則它是這樣的型別C,A并且 和B都是非嚴格的的子型別C并且沒有型別D是Cwhere的嚴格子型別A并且B是的非嚴格子型別D(非嚴格意味著我們可以將一個型別視為其自身的子型別;嚴格意味著我們不能)。的型別
println("hello")是Unit的型別
(1, "hi")是Tuple2[Int, String]Unit的超型別是AnyVal和AnyTuple2的超型別是Serializable,Product2[Int, String],Product,Equals,AnyRef, andAny(從技術上講,Product2's 和Tuple2's 的協方差意味著有更多的超型別(例如Tuple2[AnyVal, String],Tuple2[Int, AnyRef],Tuple2[Any, Any]),但這些最終與此處無關)因此
Any,最小上界是,所以if運算式的型別以及 的型別b是Any
您可以在 REPL 中演示這一點,例如 sbt console
scala> :paste
// Entering paste mode (ctrl-D to finish)
val a=10; val b=if(a==5) println("hello") else (1,"hi")
// Exiting paste mode, now interpreting.
a: Int = 10
b: Any = (1,hi)
請注意,即使謂詞a == 5永遠不會true,因此后續分支永遠不會被采用,但打字機不會考慮這一點。
另請注意,如果您有一個包含該主體的方法:
def someMethod = {
val a = 10
val b = if(a==5) println("hello") else (1,"hi")
}
該方法的結果型別將是Unit,因為結果型別是方法中最后一個運算式的型別,并且賦值(作為副作用)的型別為Unit。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/358554.html
標籤:斯卡拉
