从Scala中的类型别名创建对象

che*_*eak 4 scala typedef

如何从scala中的类型别名构造对象?

type MyType = List[Int]
println(List[Int]())
println(MyType())  // error: not found: value MyType
Run Code Online (Sandbox Code Playgroud)

这在必须返回该类型的新实例的函数中存在问题.基本示例:

def foo(x: MyType): MyType = {
  if (x.head == 0) MyType() // Should Nil be used?
  else if (x.head == -1) new MyType(1,2,3,4)
  else x
}
Run Code Online (Sandbox Code Playgroud)

怎么会foo不知道实际的类型MyType

Tra*_*own 12

Scala(与Java一样)具有不同的类型和值命名空间,而类型别名仅将别名引入类型命名空间.在某些情况下,您可以将别名与val引用伴随对象配对,以获得您正在寻找的效果:

scala> case class Foo(i: Int)
defined class Foo

scala> type MyType = Foo
defined type alias MyType

scala> val MyType = Foo
MyType: Foo.type = Foo

scala> MyType(1)
res0: Foo = Foo(1)
Run Code Online (Sandbox Code Playgroud)

List[Int]但是,这不起作用,因为虽然List类型和List伴随对象的apply方法都有一个类型参数,但List伴随对象本身却没有.

你最好的选择是使用类似的东西Nil: MyType,但是你会发现通常使用这样的类型别名(即仅作为一种缩写)通常不是最好的解决方案.