gpt4 book ai didi

scala - scala编译器如何从父类(super class)调用抽象方法?

转载 作者:行者123 更新时间:2023-12-02 09:10:50 26 4
gpt4 key购买 nike

我是 Scala 世界的新手,对 OOPS 概念有点困惑。这是我的代码片段。

abstract class Element {
def contents: Array[String]
val lenth = contents.size
val maxLength = contents.map(_.size).max
}
class ArrayElement(var contents: Array[String]) extends Element

据我了解,Scala编译器将为我们生成contents、contents_=方法。因此我们可以避免在基类中定义 def 内容抽象方法。我的理解正确吗?如果是的话

val names = Array("welcome", "apple", "Test")
val names1 = Array("apple", "Test")
var t = new ArrayElement(names);
println(t.contents.mkString(",")) //Op : welcome,apple,Test
t.contents = names1 // because of var

#1 println(t.contents.mkString(","))//操作:苹果,测试 #2 println(t.lenth)//这里我得到 3 (名称长度)。但我期待 2 .为什么 ? #3 println(t.maxLength)//此处引用相同的名称。为什么?

'#1 正在提供更新的名单。但 #2 和 #3 给出的是旧名称引用。为什么 ?

最佳答案

如果你反编译 Element 类,你会发现类似的东西:

public abstract class Element {
private final int lenth = // call contents()
private final int maxLength = // call contents()

public abstract String[] contents();

public int lenth() {
return this.lenth;
}

public int maxLength() {
return this.maxLength;
}
}

因此 lenthma​​xLength 字段在对象创建阶段初始化一次,并且永远不会改变。

当你反编译ArrayElement类时,会有这样的东西:

public class ArrayElemen extends Element {

private String[] contents;

@Override
public String[] contents() {
return this.contents;
}

//...
}

因此,当您调用 t.contents 时,它将被转换为 t.contents() 返回您更改后的值。

关于scala - scala编译器如何从父类(super class)调用抽象方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52423202/

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