选项方法签名,此范围内已定义的函数

min*_*olf 1 scala overloading method-signature

def createFloatBuffer(data: Option[Quaternion]*): Option[FloatBuffer] = data match {
  ...
}

def createFloatBuffer(data: Option[Vector3f]*): Option[FloatBuffer] = data match {
  ...
}
Run Code Online (Sandbox Code Playgroud)

由于两种方法具有相同的方法签名,因此不会编译此代码.没有类型不知道调用哪种方法.

我可以重命名方法,但是我想在我的代码中重载样式.

Eug*_*nev 8

在类型擦除之后,这两种方法变为createFloatBuffer(data:Option),并且所有类型的信息都会丢失,并且在运行时不可用.

作为一种解决方法,我建议您使用TypeClass模式.

case class Quaternion(v: Int)
case class Vector3f(v: Int)

case class FloatBuffer(v: Int)

sealed trait FloatBufferBuilder[T] {
  def createFloatBuffer(data: Option[T]): Option[FloatBuffer]
}

implicit object QuaternionFloatBufferBuilder extends FloatBufferBuilder[Quaternion] {
  def createFloatBuffer(data: Option[Quaternion]) = data.map(d => FloatBuffer(d.v))
}

implicit object Vector3fFloatBufferBuilder extends FloatBufferBuilder[Vector3f] {
  def createFloatBuffer(data: Option[Vector3f]) = data.map(d => FloatBuffer(d.v))
}

def createFloatBuffer[T : FloatBufferBuilder](data: Option[T]): Option[FloatBuffer] =
  implicitly[FloatBufferBuilder[T]].createFloatBuffer(data)


println(createFloatBuffer(Some(Quaternion(1))))
println(createFloatBuffer(Some(Vector3f(1))))
Run Code Online (Sandbox Code Playgroud)

磁铁模式也可能对你有趣:http://spray.io/blog/2012-12-13-the-magnet-pattern/