2015-10-03 40 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