2015-10-03 68 views
0

我想要使用具有一個屬性引用另一個案例類的案例類。但是在某些情況下,我構造了一個可以獲得奇怪類型錯誤的對象。斯卡拉嵌套案例類生成奇怪的類型錯誤

所以像這樣的東西很好。

case class Foo(a:Int) 
case class Bar(b:Foo, c:Foo) 
val t = Bar(Foo(1),Foo(2)) 
//t: Bar = Bar(Foo(1),Foo(2)) 

當我窩成一個對象,也似乎沒有任何問題

object w { 
    case class Foo(a:Int) 
    case class Bar(b:Foo, c:Foo) 
} 

我甚至可以創建一個對象

val t = w.Bar(w.Foo(1),w.Foo(2)) 

然而,當我嘗試從先前定義的Foo構造對象,它給了我一個瘋狂的類型錯誤。

val f = w.Foo(1) 
w.Bar(f,f) 

// error: type mismatch; 
// found : w.Foo 
// required: w.Foo 
//    w.Bar(f,f) 

任何想法? Scala 2.10.5

+0

斯卡拉2.11.7正常工作 – ka4eli

+0

我不能重現這個(斯卡拉上2.10.5) – roterl

回答

4

如果您在控制檯上嘗試它,而重新定義某些類,則可能會發生這種情況。
如果您在控制檯中輸入:

scala> :paste 
// Entering paste mode (ctrl-D to finish) 

case class Foo(a:Int) 
case class Bar(b:Foo, c:Foo) 
val t = Bar(Foo(1),Foo(2)) 

object w { 
    case class Foo(a:Int) 
    case class Bar(b:Foo, c:Foo) 
} 

// Exiting paste mode, now interpreting. 

defined class Foo 
defined class Bar 
t: Bar = Bar(Foo(1),Foo(2)) 
defined module w 

scala> val t = w.Bar(w.Foo(1),w.Foo(2)) 
t: w.Bar = Bar(Foo(1),Foo(2)) 

scala> val f = w.Foo(1) 
f: w.Foo = Foo(1) 

scala> w.Bar(f,f) 
res1: w.Bar = Bar(Foo(1),Foo(1)) 

它將工作。但是,如果你再重新將W對象時,它會失敗:

scala> object w { 
    |  case class Foo(a:Int) 
    |  case class Bar(b:Foo, c:Foo) 
    | } 
defined module w 

scala> w.Bar(f,f) 
<console>:14: error: type mismatch; 
found : w.Foo(in object w)(in object w)(in object w)(in object w) 
required: w.Foo(in object w)(in object w)(in object w)(in object w) 
       w.Bar(f,f) 

這發生,因爲在第2W w.Bar(f,f),它使用的是第二類型定義W,但F被定義在第一時間。由於它們實際上是不同的對象(相同的名稱和屬性,但類型本身不同),所以它不適合。
如果你將重新定義依賴類(F),那麼它將作品:

scala> object w { 
    |  case class Foo(a:Int) 
    |  case class Bar(b:Foo, c:Foo) 
    | } 
defined module w 

scala> val f = w.Foo(1) 
f: w.Foo = Foo(1) 

scala> w.Bar(f,f) 
res3: w.Bar = Bar(Foo(1),Foo(1)) 
+0

感謝,這是偉大的 – jeff