2016-12-31 47 views
2
scala> val a = Int 
a: Int.type = object scala.Int 

scala> val a = String 
<console>:11: error: object java.lang.String is not a value 
     val a = String 
      ^

爲什麼沒有斯卡拉圍繞java.lang.String創建一個薄包裝爲了使String有價值?當一種主要類型(String)不能用於表達式或傳遞給函數或從函數返回時,是不是非常嚴格?爲什麼字符串不是一個值?

+0

*當主表達式中的某個主類型(字符串)不能用於表達式或傳遞給函數或從函數返回時,它的限制性不是很大嗎?*爲什麼會這樣假設?不知道'String'綁定了什麼值試圖傳達 –

+0

@YuvalItzchakov我習慣於動態類型的語言(例如我可能想要在運行時驗證某些東西的類型)。我猜測在靜態語言中,將類型存儲在變量中不是很有用/常見(因爲類型在編譯時已知)?也就是說,'val a = Int'在scala中是有效的;所以可能至少有一些用途呢? – max

+5

您可以執行'val tpe = typeOf [String]'或'val cls = classOf [String]'。並且'val a = Int'是有效的,因爲Int是Int類型的伴侶對象。 – adamwy

回答

3

那麼...在斯卡拉class的可以有伴侶對象。

並且任何class A的配對對象實際上都是A.type的實例。

所以...當你這樣做,

val i = Int 

你得到的是class Intcompanion object這是Int.type

實例請記住,Int仍然不是一個值......這你擁有的東西不是Int。這也不是Int的實例。這是Int.type的一個實例。

但是,就String而言......它被定義爲來自Java世界的相應java.lang.String的別名,因此沒有這樣的companion object。因此val分配不適用於它。

至於爲什麼String不包裹在斯卡拉。這可能有很多原因。但其中一個主要原因是因爲沒有必要這樣做。

斯卡拉想要有pure對象層次結構,使所有東西都是一個對象,並從同一個根Any繼承。 Java有基本類型,如int,long等...這不是對象......這就需要將它們包裝成Int

0

雖然這個問題可能打開一個約reifying一種誤解,下面的建議,爲什麼你可以選擇Java靜,彷彿它們是一個同伴對象的成員,即使沒有這樣的對象:

$ scala 
Welcome to Scala 2.12.1 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_111). 
Type in expressions for evaluation. Or try :help. 

scala> java.lang.System.currentTimeMillis 
res0: Long = 1483263161912 

scala> java.lang.System 
<console>:12: error: object java.lang.System is not a value 
     java.lang.System 
       ^

scala> java.lang.System.toString 
<console>:12: error: value toString is not a member of object System 
Note that System extends Any, not AnyRef. 
Such types can participate in value classes, but instances 
cannot appear in singleton types or in reference comparisons. 
     java.lang.System.toString 
         ^

scala> 
相關問題