1
我可以理解爲什麼下面的代碼不能被編譯:無法明白爲什麼`性狀你好[+ A] {DEF測試[B <:A]}`不能被編譯
trait Hello[+A] {
def test[B<:A](x: B)
}
因爲:
val child: Hello[String] = new Hello[String] {
def test[B <: String](x: B) = x.substring(1)
}
val parent: Hello[Any] = child
parent.test(123) // child.test can't handle integer
但我不明白爲什麼好下面的代碼不能被編譯:
trait Hello[+A] {
def test[B<:A]
}
不同的是後來的一個沒有參數,我們不能將任何值傳遞給test
方法。
爲什麼編譯器仍然認爲它是無效的?
示例'def test [B <:A]:B = this'不好。實際上,B是不變的,它可能出現在返回式位置。參見compilable的例子:'特質貓[-A] {def meow [B <:A](x:B):B}' – Freewind
我認爲原因是'B'可以從參數推斷出來,但也可以指定。所以'val parent:Hello [Any] = child; parent.test [Any]',我們可以將'Any'指定爲'test',但不是'String'的子類型。 – Freewind