我很抱歉,我無法制定標題(或有關此問題的問題),因爲我不知道這裏發生了什麼。爲什麼不編碼:奇怪的編譯錯誤涉及帶有通配符的類型參數
class Foo
class Bar[+R <: Foo] { def bar = "bar" }
class Bak(val b: Bar[_])
val bak = new Bak(new Bar[Foo])
bak.b.bar // fine
println(bak.b) // fine
bak.b // oops!
^^^ type arguments [Any] do not conform to class Bar's type parameter bounds [+R <: Foo]
這是什麼?爲什麼我可以使用該變量,但不能將它分配給一個val? 這對任何人都有意義嗎?
你可以綁定通配符類Bak(val b:Bar [_ <:Foo])',儘管我不知道它爲什麼會等待錯誤。即使將它設置爲通配符val似乎也不起作用。 –
@MichaelZajac很好,是的......我也可以做'class Bak(val v:Bar [Foo])',因爲協變性,這幾乎是相同的東西。我認爲,在這種情況下使用通配符的唯一原因是簡潔 - 所以人們不必拼寫出'Foo'..但是必須明確寫出邊界來否定該目的:( – Dima
'Bar [_]'默認爲'Bar [_ <:Any]'根據SLS 3.10佔位符的語法,這很奇怪,錯誤只在分配給某個值時才顯示出來 –