首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么可以在类型字段中混合使用类?

为什么可以在类型字段中混合使用类?
EN

Stack Overflow用户
提问于 2012-07-01 18:06:31
回答 2查看 175关注 0票数 8

为什么我可以说一个类型字段具有一个类的类型,另一个类混合在其中(当一个类中只能混合特征时)?

示例:

代码语言:javascript
运行
复制
scala> class A
defined class A

scala> class B extends A
defined class B

不允许将B混合到A中:

代码语言:javascript
运行
复制
scala> new A with B
<console>:10: error: class B needs to be a trait to be mixed in
             new A with B
                        ^

但这是可能的:

代码语言:javascript
运行
复制
scala> class E {type T = A with B}
defined class E

scala> new E
res1: E = E@1f2bc83
EN

回答 2

Stack Overflow用户

发布于 2012-07-01 20:55:52

mixin实例化和复合类型定义之间存在差异。首先,A with B类型确实存在并且正是B类型,但是在scala中编写它是完全合法的

代码语言:javascript
运行
复制
val x: A with B = new B

按原样

代码语言:javascript
运行
复制
val y: Any with AnyRef with A with B = new B

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

此外,您必须记住,Scala不一定需要一个类型来驻留--也就是说,底层类型Nothing可能根本不需要实例化。但是,由于Nothing是可以用Scala表示的每种类型的子类型,因此编写如下表达式甚至是有效的

代码语言:javascript
运行
复制
def foo: AnyRef with AnyVal = sys.error("IMPOSSIBRU!")

根据定义,NothingAnyRef with AnyVal的一个子类型,因此该声明可以检查类型。

票数 6
EN

Stack Overflow用户

发布于 2012-07-01 18:32:03

这被称为compound type,与特征无关。它允许您表示一个类型是几个其他类型的子类型。

有关它们可能出现的更多信息,请参阅“类型处理”一节中的Scala tag info

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11281115

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档