2014-10-04 47 views
0

我想知道如果我理解Scala中的上下文界限,所以我寫了一個小的虛擬示例以查看隱式變量如何傳遞。我的代碼如下。Scala上下文界限語法錯誤

class Data(_x : Int) { 
    var x = _x 
    } 

    class DataOrdering extends Ordering[Data] { 
    def compare(d1 : Data, d2 : Data) : Int = d1.x - d2.x 
    } 

    def globalCompare[Data : Ordering](d1 : Data, d2 : Data) { 
    println("Global compare: " + implicitly[Ordering[Data]].compare(d1, d2)) 
    } 

    def caller()(implicit d : Ordering[Data]) { 
    println("Caller") 
    globalCompare(new Data(5), new Data(100)) 
    } 

    // Error method here 
    def caller2[Data : Ordering]() { 
    println("Caller2") 
    globalCompare(new Data(50), new Data(100)) 
    } 

    def main() { 
    implicit val dataOrdering : DataOrdering = new DataOrdering 
    caller 
    caller2 
    } 

    main 

呼叫者()方法的工作,我希望呼籲globalCompare,但caller2()給了我一個編譯錯誤

error: class type required but Data found 
    globalCompare(new Data(50), new Data(100)) 
        ^

    error: class type required but Data found 
    globalCompare(new Data(50), new Data(100)) 
           ^

我預期調用者()和caller2()是等價的,但我似乎錯過了一些東西。有人可以向我解釋我做錯了什麼嗎?

+0

爲什麼'case class Data(x:Int)'?爲什麼可變字段? – 2014-10-04 02:00:55

+0

這是一個非常隨意的選擇,因爲它不是我在整體測試中關心的。 – azelo 2014-10-04 07:19:09

+0

如果你不在意,你的頭腦應該默認爲'case class'。 – 2014-10-04 16:33:12

回答

1

在調用者2中,Data是一個類型參數,而不是類名。

這可能是在某個地方被騙了。

Like here,其中@TravisBrown在extreme中將其稱爲annoying

我不知道是否在遮蔽具體類型名稱時更煩人。我想知道Xlint是否會提醒你。有人的棉絨應該。

+0

謝謝!花了一點時間,但解釋是有道理的。我很抱歉重複,因爲我沒有意識到這是一個影子問題(或甚至意味着什麼),然後再閱讀您提供的鏈接。 – azelo 2014-10-04 07:17:56