Scala代码:
trait T
class C
type W = C with T
class X extends W
W
是一个类型别名,但我想定义一个类来扩展它。为什么以及如何解决它?
答案 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是最终类,不能扩展。