Scala:methodapply在尝试重载case类apply方法时定义了两次
我正在尝试重载case类的apply方法:Scala:methodapply在尝试重载case类apply方法时定义了两次,scala,apply,Scala,Apply,我正在尝试重载case类的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) } }
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)
}
}
为什么会出现此错误?当您定义一个case类时,编译器实际上会生成一个apply方法。如果跳过在伴生对象中定义应用,则这是编译后的代码:
$javap Percentage$.class
从“SparkHangTest.scala”编译而来
公共最终类org.kp.funspark.Percentage$实现scala.Serializable{
public static final org.kp.funspark.Percentage$MODULE$;
公共静态{};
public org.kp.funspark.Percentage apply(双倍);
公共scala.Option未应用(org.kp.funspark.Percentage);
}
之所以出现错误,是因为您使用与生成的方法相同的参数和返回类型定义了apply。因此,您基本上是试图用一个apply重写apply方法,该apply接受完全相同的参数,并具有相同的返回类型
例如,如果将另一个参数用于apply
,则不存在冲突:
案例类别百分比(值:双精度)
对象百分比{
def应用(值:Int):百分比={
如果(值<-1)百分比(-1.0)
否则,如果(值>1)百分比(1.0)
其他百分比(值)
}
}
以及编译后的代码:
$javap Percentage$.class
从“SparkHangTest.scala”编译而来
公共最终类org.kp.funspark.Percentage$实现scala.Serializable{
public static final org.kp.funspark.Percentage$MODULE$;
公共静态{};
public org.kp.funspark.Percentage apply(int);//这是新的apply
public org.kp.funspark.Percentage apply(双倍);
公共scala.Option未应用(org.kp.funspark.Percentage);
}
case类已经隐式添加了一个apply方法。。看看这个类似的问题:
method apply is defined twice conflicting symbols both originated in file