Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala:methodapply在尝试重载case类apply方法时定义了两次_Scala_Apply - Fatal编程技术网

Scala:methodapply在尝试重载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类的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类时,编译器实际上会生成一个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