2014-03-04 47 views
1

說我定義類型推斷令人驚訝的行爲

class X[K, T](create: K => T) { 

} 

,然後我定義下面的類執行以下操作:

class A { 

    val cb = new X[Int, B](i => new B(i)) // infers type fine 
    val cc = new X[Int, C](i => new C(0, i)) // cannot infer type and requires parameter type 

    class B(i: Int) {} 

    class C(i1: Int, i2: Int) {} 
} 

我很奇怪,爲什麼編譯器不能在創建推斷出類型爲我CC?

感謝 德

+2

你該怎麼辦'新X [詮釋,B]'當給定函數返回一個'新C'和'C'不一個'B'?它不應該是'new X [Int,C](...)'? – gourlaysama

+0

對不起,我的一個錯字。應該有讀:val cc = new X [Int,C] ...已更新 – user79074

+0

我有一種預感,Scala編譯器不會檢查'C'的類型以確定'i'的類型。 –

回答

0

我認爲錯誤消息是不正確。 C不是B的子類型,所以你不能用新的C()實例化X[Int, B],除非C延伸B

例如,此代碼工作正常:

class A { 

    val cb = new X[Int, B](i => new B(i)) 
    val cc = new X[Int, B](i => new C(0, i)) 

    class B(i: Int) {} 

    class C(i1: Int, i2: Int) extends B(i1){} 
} 
+0

犯了一個錯字。相應更新。 – user79074

3

我認爲這是一個錯字:

val cc = new X[Int, C](i => new C(0, i)) 

隨着new X[Int, B](i => new C(0, i))你告訴編譯器XX[Int, B]型的,而是提供構造參數create=> C(應該是=> B)。

因此,它拋出一個錯誤,它預計B,但您提供C

+0

是一個錯字。正確!現在修復 – user79074

+0

@ user79074那麼你可以接受答案:) – Jatin

相關問題