Class 为什么可以在类型字段中混入类?

Class 为什么可以在类型字段中混入类?,class,scala,Class,Scala,为什么我可以说一个类型字段的类型是一个类和另一个类混合在一起的类型(当一个类中只能混合特征时) 例如: scala> class A defined class A scala> class B extends A defined class B 不允许将B混入A中: scala> new A with B <console>:10: error: class B needs to be a trait to be mixed in n

为什么我可以说一个类型字段的类型是一个类和另一个类混合在一起的类型(当一个类中只能混合特征时)

例如:

scala> class A
defined class A

scala> class B extends A
defined class B
不允许将
B
混入
A
中:

scala> new A with B
<console>:10: error: class B needs to be a trait to be mixed in
             new A with B
                        ^
这被称为a,与特质无关。它允许您表示一个类型是其他几种类型的子类型


有关它们可能出现在何处的更多信息,请参见“类型处理”一节。mixin实例化和复合类型定义之间存在差异。 首先,类型
A和B
是存在的,并且正是类型
B
,唉,在scala中编写是完全合法的

val x: A with B = new B
原样

因为它描述了完全相同的类型。 您只是在可以分配给该类型变量的值的类型中引入限制。 在这种情况下,这些限制当然始终有效

此外,您必须记住,Scala不一定需要一个类型来居住,也就是说,底部的类型
Nothing
可能根本不会被实例化。 但是,由于
Nothing
是可以在Scala中表示的每种类型的子类型,因此编写如下表达式是有效的

def foo: AnyRef with AnyVal = sys.error("IMPOSSIBRU!")

Nothing
是定义为带有AnyVal的
AnyRef的子类型,因此声明类型会进行检查。

这并没有回答问题:为什么可能?RobinGreen:为什么不可能<代码>新A与B
意味着将
B
混合到
A
类型T=A与B
意味着
T
属于
A
类型和
B
@Antoras--这个问题是有效的。既然您不能实例化两个类的混合,那么在什么情况下您可以拥有两个类的复合类型呢?虽然整个系统仍然完好,但有人可能会说,当编译器知道在
A和B中引用了这两种类型的类时,它至少会发出警告。@Sciss:好的,我没有想到这一点。我同意,如果两个类都是类,编译器应该抛出一个错误。另一方面,它是无害的,你最终不会做错任何事。。。但我不知道这样的陈述是否有用处。
val y: Any with AnyRef with A with B = new B
def foo: AnyRef with AnyVal = sys.error("IMPOSSIBRU!")