2015-08-25 59 views
0
*/ 
class Parent 

class Child extends Parent 

class GrandChild extends Child 

object main{ 

    def test[B >: Child](x : B) = x; // B should be of type Child or Parent 

    def main(args: Array[String]): Unit = { 
    test(new Parent); //works. B == Parent 
    test(new Child); //works. B == Child 
    test (new GrandChild) // works!!! Surprise!!! B == GrandParent. This should not work, right? 

    } 
} 

我在期待那個測試(新的GrandChild)應該給編譯錯誤。它是如何工作的?我是否理解錯誤的類型?混淆上限類型綁定和下限類型

回答

0

由於GrandChild延伸Child編譯器已經選擇B類型參數是Child在調用

test(new GrandChild) 

如果明確指定類型你的錯誤,你希望:

test[GrandChild](new GrandChild) 
0

B> :Child意味着B應該是超類型的Child,所有這些類都是Parent(Child和GrandChild),因爲都從Parent延伸。

+0

如果B>:小孩表示B應該是超類型Child,則 測試(新GrandChild)應該失敗,因爲GrandChild不是超類型的Child。它應該是一個編譯錯誤 – amol

+0

新的Child和新的GrandChild是Parent的實例,在這裏向上執行upcast – grotrianster