斯卡拉代码:
trait T
class C
type W = C with T
class X extends W
W
是一个类型别名,但我想定义一个类来扩展它。为什么以及如何解决它?
我很难以一种很好的方式构建我的答案,但这里仍然试图解释正在发生的事情:
你会得到一个编译错误,因为extends
子句需要类和特征,而不是类型,并且您给出一个类型。类和特征不得与类型混淆。
对此肯定有更好的解释。但基本上,类型指定了可应用于某些内容(有时还应用于其他属性)的操作。类和特征定义了behavior他们的实例。
在大多数静态类型的面向对象语言中,每个类/接口/特征也有一个关联的type。然而,倒数通常不是真的:并非所有类型都有相应的类/接口/特征。例如,您的C with T
是一种类型,但不是类,也不是特征(甚至不是它们的组合)。
The extends
子句需要类和特征(用分隔符分隔)with
),但不是一种类型。这是因为extends
意思是:延长behavior这件事的。正如我所说,类型不定义行为。
在大多数地方,语法A with B
代表一个type这是两种类型的子类型A
和类型B
。在里面extends
然而,条款with
具有不同的含义,只是充当参数的分隔符extends
(很像,
充当方法调用参数的分隔符)。
如果你写class X extends C with T
,它会起作用,因为这意味着class X extends C, T
, 如果你想。
HTH
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)