Опция метода подписи, функция уже определена в этой области

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

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

Этот код не будет компилироваться из-за двух методов, имеющих одинаковую сигнатуру метода. Ни один тип не будет знать, какой метод вызывать.

Я мог бы просто переименовать методы, однако я хотел бы использовать этот стиль перегрузки в моем коде.

2 ответа

После стирания типа эти два метода становятся 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))))

Также вам может быть интересен магнитный паттерн: http://spray.io/blog/2012-12-13-the-magnet-pattern/

Это вариант использования для:

scala> object X { def f(is: Int*) = 42 ; def f(ds: Double*) = 43 }
<console>:10: error: double definition:
def f(is: Int*): Int at line 10 and
def f(ds: Double*): Int at line 10
have same type after erasure: (is: Seq)Int
       object X { def f(is: Int*) = 42 ; def f(ds: Double*) = 43 }
                                             ^

scala> object X { def f(is: Int*) = 42 ; def f(ds: Double*)(implicit dummy: DummyImplicit) = 43 }
defined object X

scala> X f 1
res2: Int = 42

scala> X f 1.0
res3: Int = 43
Другие вопросы по тегам