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)
由于两种方法具有相同的方法签名,因此不会编译此代码.没有类型不知道调用哪种方法.
我可以重命名方法,但是我想在我的代码中重载样式.
在类型擦除之后,这两种方法变为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/