gpt4 book ai didi

scala - Scala 中不同的覆盖方法有什么区别?

转载 作者:行者123 更新时间:2023-12-04 00:54:57 27 4
gpt4 key购买 nike

Scala 允许您以两种合法方式覆盖方法:

给定父类(super class):

class A {
def a = "A"
}

我们可以通过以下方式覆盖方法“a”:
class B extends A {
override def a = "B"
}


class B extends A {
override def a() = "B"
}

两者似乎都正确地覆盖了方法“a”。这背后的设计决策是什么?为什么允许 B 中的“a()”覆盖 A 中的“a”?

最佳答案

情况并非总是如此(来自 the language specification 的更改日志):

Scala version 2.0 also relaxes the rules of overriding with respect to empty parameter lists. The revised definition of matching members (§5.1.3) makes it now possible to override a method with an explicit, but empty parameter list () with a parameterless method, and vice versa.



考虑到无参数方法和具有空参数列表的方法之间存在明显差异,您认为这似乎是一个奇怪的设计决策是正确的。例如,假设您有以下内容:
class A { def a = "A" }
class B extends A { override def a = "B" }
class C extends A { override def a() = "C" }

现在我们可以按预期编写以下内容:
scala> (new B).a
res0: java.lang.String = B

scala> (new C).a
res1: java.lang.String = C

还有这个:
scala> (new C).a()
res2: java.lang.String = C

但不是这个:
scala> (new B).a()
<console>:10: error: not enough arguments for method apply: (index: Int)Char in class StringOps.
Unspecified value parameter index.
(new B).a()

所以Scala确实对两者做了区分,这显然必须体现在字节码中。假设我们编译如下:
class A { def a = "A" }
class B extends A { override def a = "B" }

然后运行:
javap -verbose B > noArgList.txt

然后把代码改成这样:
class A { def a = "A" }
class B extends A { override def a() = "B" }

重新编译,运行:
javap -verbose B > emptyArgList.txt

最后检查差异:
<   MD5 checksum 88aeebf57b645fce2b2fcd2f81acdbbd
---
> MD5 checksum 3733b3e4181b4b2f4993503d4c05770e
32c32
< #18 = Utf8 }1A!
\t\t!ICaT-9uszaE\r)\"a\tI!!\"1Q!Dg
jiz\"a\tAQ!BY\t!Y G.Y11bU2bY|%M[3di\")C%1A(
/A$H3)!dGYtwMCQM^1\nyI\"AB*ue&tw\r
---
> #18 = Utf8 }1A!
\t\t!ICaT-9uszaE\r)\"a\tI!!\"1Q!Dg
jiz\"a\tAQ!BY\t! G.Y11bU2bY|%M[3di\")C%1A(
/A$H3)!dGYtwMCQM^1\nyI\"AB*ue&tw\r

所以是有区别的——两个版本的 ScalaSignature 注释有不同的值。

至于为什么在 Scala 2.0 中进行了更改:规范指出它允许这样做:
class C {
override def toString: String = ...
}

我的猜测是语言设计者只是没有看到要求用户记住在这种情况下使用的覆盖方法的方法的理由。

关于scala - Scala 中不同的覆盖方法有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12231534/

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