Scala 为什么?;丙级;;类X扩展(C加T)`can';不能编译吗?

Scala 为什么?;丙级;;类X扩展(C加T)`can';不能编译吗?,scala,type-systems,Scala,Type Systems,Scala代码: trait T class C type W = C with T class X extends W W是一个类型别名,但我想定义一个类来扩展它。为什么以及如何修复它?字符串是最后一个类,不能扩展。我很难用一种好的方式构造我的答案,但这里还是尝试解释一下发生了什么: 出现编译错误是因为extends子句需要类和traits,而不是类型,并且您正在提供类型。类和特征不能与类型混淆 当然有更好的解释。但基本上,类型指定了可以应用于某个对象(有时还有其他属性)的操作。类和特征定义

Scala代码:

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

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

字符串是最后一个类,不能扩展。

我很难用一种好的方式构造我的答案,但这里还是尝试解释一下发生了什么:

出现编译错误是因为
extends
子句需要类和traits,而不是类型,并且您正在提供类型。类和特征不能与类型混淆

当然有更好的解释。但基本上,类型指定了可以应用于某个对象(有时还有其他属性)的操作。类和特征定义其实例的行为

在大多数静态类型的OO语言中,每个类/接口/特征都有一个关联的类型。然而,倒数通常不是真的:不是所有类型都有相应的类/接口/特征。例如,带T的
C是一个类型,但不是一个类或特征(甚至不是它们的组合)

扩展
子句需要类和特征(用
分隔),但不是一种类型。这是因为
扩展
的意思是:扩展这个东西的行为。正如我所说,类型并不定义行为

在大多数情况下,语法
A和B
表示一种类型,该类型是
A
类型和
B
类型的子类型。但是,在
extends
子句中,
with
具有不同的含义,只是充当
extends
参数的分隔符(与
非常相似,
充当方法调用参数的分隔符)

如果您编写
类X用T扩展C,它将起作用,因为如果您愿意,它意味着
类X扩展C,T


HTH

虽然这是正确的,但问题是不支持类型扩展,即使您使用某个自定义类而不是字符串,它也不会编译。对,我将其更改为自定义类,相同的编译错误“您得到编译是因为extends子句需要类和特征,而不是类型”就足够了,删除其余部分:)