为什么我可以说一个类型字段具有一个类的类型,另一个类混合在其中(当一个类中只能混合特征时)?
示例:
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
^
但这是可能的:
scala> class E {type T = A with B}
defined class E
scala> new E
res1: E = E@1f2bc83
发布于 2012-07-01 20:55:52
mixin实例化和复合类型定义之间存在差异。首先,A with B
类型确实存在并且正是B
类型,但是在scala中编写它是完全合法的
val x: A with B = new B
按原样
val y: Any with AnyRef with A with B = new B
因为它描述的是完全相同的类型。您只是在可以分配给该类型变量的值的类型中引入了限制。当然,这些限制在这种情况下总是有效的。
此外,您必须记住,Scala不一定需要一个类型来驻留--也就是说,底层类型Nothing
可能根本不需要实例化。但是,由于Nothing
是可以用Scala表示的每种类型的子类型,因此编写如下表达式甚至是有效的
def foo: AnyRef with AnyVal = sys.error("IMPOSSIBRU!")
根据定义,Nothing
是AnyRef with AnyVal
的一个子类型,因此该声明可以检查类型。
发布于 2012-07-01 18:32:03
这被称为compound type,与特征无关。它允许您表示一个类型是几个其他类型的子类型。
有关它们可能出现的更多信息,请参阅“类型处理”一节中的Scala tag info。
https://stackoverflow.com/questions/11281115
复制相似问题