scala嵌套的case类生成奇怪的类型错误

时间:2015-10-03 06:14:02

标签: scala

我正在尝试使用一个具有一个属性引用另一个案例类的案例类。但是在某些条件下,我构造了对象,我得到了奇怪的类型错误。

所以这样的事情很好。

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

1 个答案:

答案 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))