[英]Which is the sub-type function in this Scala example?
我正在閱讀Martin Odersky的Scala-by-example(2014)。 在第61頁上,可以說從String類型到Int類型的函數表示為特征Function1 [String,Int]的實例。 其中Function1定義為:
trait Function1[-A,+B] {def apply(x: A): B}
也有人說
如果S'是S的子類型,並且T是T'的子類型,則S => T是S'=> T'的子類型。
他使用以下代碼示例: val f: (AnyRef => Int) = x => x.hashCode() val g: (String => Int) = fg("abc")
所以這是我的問題。 由於String是AnyRef的子類型,因此我假設在此示例中f表示g的子類型。 那是對的嗎? 如果是這樣,請解釋該確定中的邏輯。
如果V
是U
的子類型,則V
可以位於U
可以位於的任何位置。
如果您有AnyRef => Int
,可以隨時使用String => Int
嗎? 是! String
是AnyRef
因此您可以傳遞它。
因此, AnyRef => Int
是String => Int
的子類型。 通過說函數的參數是相反的來描述這種關系(這是正常情況下的“倒退”)。
也就是說, 實例 f
和g
不一定有任何關系。 但是它們的類型可以。
f和g函數,函數具有類型差異,它允許類型參數的子類型和超類型: http : //docs.scala-lang.org/tutorials/tour/variances.html
在scala終端中運行以下代碼將為您提供與運行示例相同的結果。
g被聲明為類型(AnyRef => Int)的函數,它將實現Function為:
val f = new Function[AnyRef /*or any supertype*/,Int /*or any subType type*/] {
def apply(x: AnyRef): Int = x.hashCode()
}
它定義為接受AnyRef
類型的參數AnyRef
返回Int
的函數。
然后,將g定義為接受String
並返回Int
的函數。 它設置為等於f,因此變為:
val g = new Function[String /*Supertype of AnyRef*/, Int] {
def apply(x: String): Int = x.hashCode()
}
雖然,在這種情況下g不是新函數。 g只是對f的另一個引用。 本質上,g被類型轉換為Function[String, Int]
。
編輯:由於AnyVal是Int的子類型,您也可以這樣做:
val gg: (String => AnyVal) = f
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.