2017-07-27 69 views
-1

爲了學習Scala,我一直在關注一些在線教程。我碰到下面的代碼片段:這個scala表達式是什麼意思? val h3:Holder [Person] = h2

class Holder[+T](val value: T) { 
    def printIt = println(value) 
} 

val h1 = new Holder(3) 
h1.printIt 

class Person 
class Employee extends Person 

val h2 = new Holder(new Employee) 
val h3 : Holder[Person] = h2 

可惜老師沒有解釋val h3表達做什麼,關於該:結腸。有人能啓發我嗎?

回答

2

這是一個Annotation類型,Scala可以自動計算出一個變量的類型(稱爲類型推斷),這就是您剛纔使用的val h3會發生什麼。但是,如果需要,您可以明確指定類型。所以val h3: Holder[Person]意味着值h3有類型Holder[Person]

您可能想要這樣做有幾個原因。首先是文檔。如果您指定了類型,則可以清楚說明該變量或方法的類型,因此您無需考慮該類型。如果您不小心犯了一個錯誤並嘗試將錯誤的類型放入變量中,它也會導致錯誤。通常情況下,像本地和私有成員這樣的東西不需要用類型註釋混淆代碼,但將它們包含在任何公共字段或方法中是一個好主意。

另一個原因是因爲你想要一個不同的類型,推理決定是合適的。通常情況下(就像在這個例子中那樣),這是因爲你分配的實際對象是你想要的方法或變量的子類型。在這個例子中,h2的類型爲Holder[Employee],因此Scala的類型也會推斷爲h3,但我們希望h3的類型爲超類型,因此我們明確包含類型註釋。

+0

我最喜歡這個答案,因爲它說明你可以明確定義類型。 – njk2015

0

+ T聲明Holder是協變的,所以Holder類型的持有者[Person]是持有者類型Holder [Employee]的超類。在這一行中,你只需聲明h3的類型是Holder [Person]。由於協變性,您可以將持有人[員工]分配給持有人[人員]。

1
val h3 : Holder[Person] = h2 

上面定義了一個名爲h3值併爲其分配h2實例。 :明確指出值h3的類型是Holder[Person]。如果省略: Holder[Person]部分,編譯器將推斷h3的類型爲Holder[Employee](因爲h2Holder[Employee])。可以正確地稱爲Holder[Person]Holder[Employee]。這是因爲Holder具有協變類型參數(+T),這意味着由於EmployeePerson的子類型,所以Holder[Employee]Holder[Person]的子類型。

相關問題