在Scala 2.10中键入别名类案例类

Jos*_*ver 9 scala

我正在使用Scala 2.10.2,并且有两个具有相同字段的case类:

case class Foo(id: String, name: String)
case class Bar(id: String, name: String)
Run Code Online (Sandbox Code Playgroud)

我想做这样的事情:

case class Thing(id: String, name: String)
type Foo = Thing
type Bar = Thing
Run Code Online (Sandbox Code Playgroud)

这编译,但当我尝试创建一个Foo,我得到:

scala> Bar("a", "b")
<console>:8: error: not found: value Bar
              Bar("a", "b")
              ^
Run Code Online (Sandbox Code Playgroud)

类型别名不适用于案例类吗?

yǝs*_*ǝla 15

创建案例类时,Scala会自动为其创建一个伴随对象.在您的代码中,您可以为类型定义别名Thing,即Thing仅为类定义.您的伴随对象Thing仍然只有一个名称,没有别名.

"修复"它的一种方法是创建对伴随对象(不是类型别名)的引用,如下所示:

scala> val Bar = Thing
Bar: Thing.type = Thing

scala> Bar("a", "b")
res1: Thing = Thing(a,b)
Run Code Online (Sandbox Code Playgroud)

另一种"修复"它的方法是重命名导入的对象import package.{Thing => Bar}.


Ran*_*ulz 5

类型别名只是别名类型,而不是可能提供工厂方法的任何伴随对象(无论您是自己编写该工厂方法还是从编译器"免费"获取一个).

在另一方面,在名称和进口,如果行为不存在与给定名称关联多个实体,导入该名称在导入的名称的每个所指使.此外,你可以在导入时重命名,你可以这样做,所以......

scala> object Stuff { case class Thing(id: String, name: String) }
defined module Stuff


scala> import Stuff.Thing
import Stuff.Thing

scala> import Stuff.{Thing => Foo}
import Stuff.{Thing=>Foo}

scala> import Stuff.{Thing => Bar}
import Stuff.{Thing=>Bar}


scala> val thing1 = Thing("fing", "fang")
thing1: Stuff.Thing = Thing(fing,fang)

scala> val foo1 = Foo("yes", "no")
foo1: Stuff.Thing = Thing(yes,no)

scala> val bar1 = Bar("true", "false")
bar1: Stuff.Thing = Thing(true,false)
Run Code Online (Sandbox Code Playgroud)

toString然而,正如你所看到的那样,渲染过程并不好.