因为我可以这样做:
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
的用例是什么?
答案 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
因此,只要您需要类型约束,它就会很有用,因为“别名”类型将与类型别名匹配,即使它未明确声明为。