我正在尝试使用一个具有一个属性引用另一个案例类的案例类。但是在某些条件下,我构造了对象,我得到了奇怪的类型错误。
所以这样的事情很好。
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 :(得分: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)
这发生在第二个w的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))