gpt4 book ai didi

scala - 单个 trait 与 mixin 的实例化

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

知道为什么我不能在不提供类主体的情况下创建单个特征的实例:

trait MyTrait
val test1 = new MyTrait // Does not compile.
val test2 = new MyTrait {} // Compiles.

但是,如果我在混合中添加另一个,那么我将能够创建一个实例:
trait MyTrait
trait SecondTrait
val anotherTest = new SecondTrait with MyTrait // Compiles successfully.

我会期待同样的行为。

旁注:我已经读过 this question .但是特征体的存在并不能回答我的问题,因为第二个例子仍然没有体。因此,为什么编译器将第二个示例视为匿名类?

最佳答案

Instance Creation Expressions的规范说:

A simple instance creation expression is of the form new c where c is a constructor invocation. Let T be the type of c. Then T must denote a (a type instance of) a non-abstract subclass of scala.AnyRef...

A general instance creation expression is of the form new t for some class template t. Such an expression is equivalent to the block { class a extends t; new a } where ais a fresh name of an anonymous class which is inaccessible to user programs.


new MyTrait , MyTrait在语法上是合法的构造函数调用。所以 new MyTrait是一个简单的实例创建表达式,它无法编译,因为 MyTrait不“表示 scala.AnyRef 的非抽象子类”。
但是 SecondTrait with MyTrait不能是构造函数调用,因此它被视为通用实例创建表达式的类模板,它创建了一个匿名类。这同样适用于 MyTrait {} .

关于scala - 单个 trait 与 mixin 的实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55268771/

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