为什么`特质T; C级; class X extends(C with T)`无法编译?

时间:2014-09-21 14:13:36

标签: scala type-systems

Scala代码:

trait T
class C
type W = C with T
class X extends W

W是一个类型别名,但我想定义一个类来扩展它。为什么以及如何解决它?

2 个答案:

答案 0 :(得分:10)

我很难以一种很好的方式构建我的答案,但这是尝试解释发生了什么:

您收到编译错误,因为extends子句需要类和特征,而不是类型,并且您需要提供类型。不得将类和特征与类型混淆。

对此有更好的解释。但基本上类型指定了可以应用于某些事物(有时是其他属性)的操作。类和特征定义其实例的行为

在大多数静态类型的OO语言中,每个类/接口/特征也都有一个关联的类型。但是,倒数通常不正确:并非所有类型都具有相应的类/接口/特征。例如,您的C with T是一种类型,但不是类,也不是特征(甚至不是它们的组合)。

extends子句需要类和特征(由with分隔),但不是一种类型。这是因为extends表示:扩展此事物的行为。正如我所说,类型没有定义行为。

在大多数地方,语法A with B代表类型,它是类型A和类型B的子类型。但是,在extends子句中,with具有不同的含义,只是充当extends的参数的分隔符(很像,充当参数的分隔符方法调用)。

如果你写class X extends C with T,它会起作用,因为它意味着class X extends C, T,如果你愿意的话。

HTH

答案 1 :(得分:1)

String是最终类,不能扩展。