這裏要記住的重要一點是,Any
是超類型的任何類型的,即
Any >: A
特別是,假設
val t = new Test[Int]
這是A
是Int
。現在我們調用
t.test("foo")
"foo"
是String
類型,但字符串是Any
亞型,因此可以認爲是這樣的,因此test[B >: A](b : B)
可以用b
爲"foo"
和B
是Any
調用。
下面的例子應該說明這一點,考慮
class Test[+A](a : A) {
def test[B >: A](b : B) : (A,B) = (a,b)
}
現在
,使用
val t = new Test(3)
val x = t.test("foo")
我們得到
x: (Int, Any) = (3,foo)
最後,補充一些細節,斯卡拉不會總是挑Any
,但最不常見的超類型A
和B
。這恰好是Any
爲Int
和String
(見http://www.scala-lang.org/old/node/128),但可能是一些其他的例子不同,例如,對於
val s = new Test(Nil)
val y = s.test("foo")
val z = s.test(List(1))
我們會得到
y: (scala.collection.immutable.Nil.type, java.io.Serializable) = (List(),foo)
z: (scala.collection.immutable.Nil.type, List[Int]) = (List(),List(1))
另外請注意,下限不不妨礙通過亞型A
scala> val a = new Test(new AnyRef())
a: Test[java.lang.Object] = [email protected]
scala> a.test("foo")
res6: (java.lang.Object, java.lang.Object) = ([email protected],foo)
所以,問題是,什麼是較低類型邊界有用嗎?一個可能的答案是它們可以用於「控制」「輸出」位置的類型,如通常用於協變類型參數的那樣,參見例如http://docs.scala-lang.org/tutorials/tour/lower-type-bounds.html粗略地說,當將元素附加到A
類型的(協變)列表時,您想要確保結果列表是「至少」A
類型。 (我很抱歉這部分內容是手動的,但由於它超出了原始問題的範圍,因此我只想給出一個簡要的概念,說明爲什麼需要它們,爲了得到完整的答案,最好創建一個新的問題)
在我的例子中,如果每個類型都可以傳遞給測試方法,爲什麼我們需要一個綁定呢?爲什麼它是一個上限而不是下限? – user2018791
@ user2018791您不能傳遞A的子類型。 –
@ user2018791我在下限有用時添加了一個簡短解釋,但是最好是專門提出一個新問題。 – godfatherofpolka