gpt4 book ai didi

scala - 如果特征组合已经在类级别中组合,则在新实例上将被忽略

转载 作者:行者123 更新时间:2023-12-02 03:34:48 26 4
gpt4 key购买 nike

代码如下:

trait Foo {

def get(x: Int): Int

}

trait Simple extends Foo {

override def get(x: Int): Int = x

}

trait Add15 extends Foo {

abstract override def get(x: Int): Int = x + 15

}

trait Add30 extends Foo {

abstract override def get(x: Int): Int = {

super.get(x) + 30
}

}


class Queue extends Simple with Add15 with Add30

new Queue with Add30 get 0 // same as new Queue get 0, because with Add30 is ignored

我只是想知道有一个编译错误而不是忽略它更好吗?就像

class Queue extends Simple with Add15 with Add30 with Add30 会出现编译错误

提前致谢

最佳答案

with 不会被忽略。

new t 的规范 actually says new Queue with Add30 等同于:

{ class a extends Queue with Add30 ; new a }

当然可以,但它真的可以编译成那样吗?

事实上:

scala> new Queue with Add30
res8: Queue with Add30 = $anon$1@aa21042

scala> :javap -prv -
Binary file res8 contains $line18.$read$$iw$$iw$
[snip]
private final $line12.$read$$iw$$iw$Queue res8;
flags: ACC_PRIVATE, ACC_FINAL
[snip]
public $line18.$read$$iw$$iw$();
flags: ACC_PUBLIC
Code:
stack=3, locals=1, args_size=1
0: aload_0
1: invokespecial #19 // Method java/lang/Object."<init>":()V
4: aload_0
5: putstatic #21 // Field MODULE$:L$line18/$read$$iw$$iw$;
8: aload_0
9: new #23 // class $line18/$read$$iw$$iw$$anon$1
12: dup
13: invokespecial #24 // Method $line18/$read$$iw$$iw$$anon$1."<init>":()V
16: putfield #17 // Field res8:L$line12/$read$$iw$$iw$Queue;
19: return

因此,结果值只是一个 Queue,但您正在实例化一个匿名子类,该子类简单地扩展了它。我太懒了(我的意思是很忙)无法尝试 -optimize

你可以反过来问为什么with T with T提示trait T is inherited twice?不能 linearization处理冗余?

我认为第二种情况,a 从线性化中消失,适用于这种情况:

scala> class X
defined class X

scala> trait Y extends X
defined trait Y

scala> new X with Y
res15: X with Y = $anon$1@5af97169

您在其中混合了一个已经扩展了 XY

但现在我必须使用我在其主要用例上涂鸦的餐巾纸(餐巾),然后回到我之前所做的事情。

关于scala - 如果特征组合已经在类级别中组合,则在新实例上将被忽略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24301412/

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