输入混合类型的别名

时间:2013-12-21 15:39:27

标签: scala types mixins

因为我可以这样做:

case class A(a: Int)
trait C

val x = new A(10) with C

为什么我不能这样做:

type X = A with C
val x = new X(10)

?如果我甚至无法构造实例,那么type X = A with C的用例是什么?

1 个答案:

答案 0 :(得分:1)

你得到的错误信息应该给你一个提示:

error: class type required but A with C found
              new X(10)
                  ^

X作为类型别名,会被重写为A with C类型表达式,而不是类类型。根据{{​​3}},后者是:

  

类型指示符   (§   3.2.3   )指的是一个类或一个特征

(强调我的)

换句话说,它不是每种类型的表达。

这不是一个权威的答案,但我认为不可能以一种类类型的方式定义类型别名。一方面,new表达式理论上接受AnnotType,如第5.1.1节中所定义。但是,我没有看到,使用4.3节中的类型别名语法,你可以指定你使用的构造函数等。

tl; dr - 除非您的类型别名可以直接重写为类类型(例如示例中为A),否则不能将其用作类类型,包括调用{{1 }} 用它。如果您需要,您需要一个类声明,即new


关于第二个问题,您说您无法实例化class X(a: Int) extends A(a) with C。啊,但那就是你错了!让我根据您的代码向您展示一个示例:

X

因此,只要您需要类型约束,它就会很有用,因为“别名”类型将与类型别名匹配,即使它未明确声明为

相关问题