2016-09-16 87 views
2

下面的代碼爲什麼Scala強制從Char到Double類型?

object testType extends App { 
    def func(x:Int) = if(x==0) 1.0 else 'c' 
    println(func(0)) 
    println(func(1)) 
} 

結果

1.0 
99.0 

起初,當我寫到這,我還以爲是斯卡拉不會允許這樣的功能,但它解釋功能(Int) => Double。這感覺就像類型強制。

如果我替換'c'"c"在功能上面,它實際上返回

1.0 
c 

在功能現在被解釋爲(Int) => Any

問題:如果Scala是強類型的,爲什麼第一例如'c'返回了Double,爲什麼(Int) => Double(Int) => Any這兩個例子之間的區別?

回答

1

Scala會在必要時在類型之間進行隱式轉換。通常它通過隨時隨地的範圍定義一些隱式轉換做這個(大部分隱式轉換都在scala.Predef這是默認進口)

爲了看到所有可用的隱式轉換在REPL做到這一點:

:implicits -v 

但是,如果你這樣做,你會發現char2Double沒有隱式轉換。發生什麼了?這裏,Scala編譯器度假村到另一種類型的轉換稱爲numeric widening

如果EE具有弱符合預期類型一個原始號碼類型,它被加寬使用的數值轉換方法之一toShort預期的類型, toChar,toInt,toLong,toFloat,toDouble在這裏定義。

所以,@Alexey在他的回答指出,煤焦弱符合雙打,炭「C」被通過應用「c'.toDouble數字擴大轉換轉換爲雙。

此外,您可以禁用PREDEF定義像這樣的隱式轉換:

// disable int to Integer conversion 
import scala.Predef.{int2Integer => _} 

但是,我不知道數字的擴大轉換是否可以被禁用。

正如指出由@ pedrorijo91,也可以通過添加合適的scalac標誌可以防止數字加寬:-Ywarn數字-加寬& -Xfatal-警告

+2

有一個編譯標誌上scalac該'-Ywarn-數字-widen'。如需更多信息,請參閱http://pedrorijo.com/blog/scala-compiler-review-code-warnings/ – pedrorijo91

+0

,如果您想「禁用它」,您也可以使用'-Xfatal-warnings',否則編譯失敗數字變寬 – pedrorijo91

+0

@ pedrorijo91感謝您的建議和文章鏈接:) – Samar

相關問題