gpt4 book ai didi

Scala:尝试重载案例类 apply 方法时,apply 方法被定义了两次

转载 作者:行者123 更新时间:2023-12-03 00:26:38 27 4
gpt4 key购买 nike

我正在尝试重载案例类的 apply 方法:

case class Percentage(value: Double)

object Percentage {
def apply(value: Double): Percentage = {
if (value < -1) new Percentage(-1.0)
else if (value > 1) new Percentage(1.0)
else new Percentage(value)
}
}

但我收到以下错误:

method apply is defined twice conflicting symbols both originated in file

为什么我会收到此错误?

最佳答案

当你定义一个case类时,编译器实际上会生成一个apply方法。如果您跳过在伴生对象中定义 apply,则这是编译后的代码:

$ javap Percentage$.class
Compiled from "SparkHangTest.scala"
public final class org.kp.funspark.Percentage$ implements scala.Serializable {
public static final org.kp.funspark.Percentage$ MODULE$;
public static {};
public org.kp.funspark.Percentage apply(double);
public scala.Option<java.lang.Object> unapply(org.kp.funspark.Percentage);
}

您收到错误是因为您使用与生成的方法相同的参数和返回类型定义了 apply。因此,您基本上是在尝试使用采用完全相同的参数并具有相同的返回类型的 apply 来重写 apply 方法。

例如,如果您对 apply 使用另一个参数,则不会发生冲突:

case class Percentage(value: Double)

object Percentage {
def apply(value: Int): Percentage = {
if (value < -1) Percentage(-1.0)
else if (value > 1) Percentage(1.0)
else Percentage(value)
}
}

编译后的代码:

$ javap Percentage$.class
Compiled from "SparkHangTest.scala"
public final class org.kp.funspark.Percentage$ implements scala.Serializable {
public static final org.kp.funspark.Percentage$ MODULE$;
public static {};
public org.kp.funspark.Percentage apply(int); // This is the new apply
public org.kp.funspark.Percentage apply(double);
public scala.Option<java.lang.Object> unapply(org.kp.funspark.Percentage);
}

关于Scala:尝试重载案例类 apply 方法时,apply 方法被定义了两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43365342/

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