gpt4 book ai didi

scala - 为什么可以在 Scala 中实例化多个特征,但不能实例化一个?

转载 作者:行者123 更新时间:2023-12-04 17:44:05 25 4
gpt4 key购买 nike

假设我们有两个特征:

trait Trait1
trait Trait2

如果我尝试类似 val single = new Trait1我收到一个错误 error: trait Trait1 is abstract; cannot be instantiated .但是, val twoTraits = new Trait1 with Trait2编译。为什么会这样?

附言我还观察到 val single = new Trait1 {}编译就好了。你能提供一个适当的解释吗?

最佳答案

从技术上讲,您不能直接实例化单个特征或多个混合特征,但编译器使用一些语法糖,允许您创建扩展它们的匿名类。假设我们有:

trait A
trait B

当您调用 new A with B ,真正发生的是编译器正在创建一个匿名类,它混合了 AB .你得到:
final class $anon extends A with B
new $anon()

当您调用 new A {} ,同样的事情也会发生。你会得到一个扩展 A 的匿名类。 :
final class $anon extends A
new $anon()

唯一的区别是语法。从单个特征创建匿名类时,您至少需要使用大括号 {}将其与类区分开来。也就是说,更容易辨别模板是否可以构造,或者必须包装在要构造的匿名类中。对于多个特征(甚至是一个混合了特征的类),编译器知道它总是需要首先创建一个匿名类。

总结一下:
class C

new A {} // Anonymous class that extends A, then constructed
new A with B // Anonymous class that extends A with B, then constructed
new C // Constructed instance of class C
new C with A // Anonymous class that extends C with A, then constructed

关于scala - 为什么可以在 Scala 中实例化多个特征,但不能实例化一个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42420558/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com