问题描述
我想重载基于泛型的方法-像这样:
case class Indexed2dArr[Dim0Type,Dim1Type] (
indices: (List[Dim0Type],List[Dim1Type]),array: List[List[Float]],) {
def getSliceAtIndexLocation(i: Dim0Type): (List[Dim1Type],List[Float]) = ???
def getSliceAtIndexLocation(i: Dim1Type): (List[Dim0Type],List[Float]) = ???
}
因此,如果使用参数getSliceAtIndexLocation
调用Dim0Type
,它将返回原始数组的一维切片,索引为Dim1Type
。反之亦然,使用Dim1Type
进行呼叫。
这会引发double deFinition
编译器错误-类型擦除后,这两种方法具有相同的类型,该类型为(i: Object): Tuple2
。有没有有效的方法可以解决这个问题?还是不可能直接解决?
解决方法
尝试DummyImplicit
case class Indexed2dArr[Dim0Type,Dim1Type] (
indices: (List[Dim0Type],List[Dim1Type]),array: List[List[Float]],) {
def getSliceAtIndexLocation(i: Dim0Type): (List[Dim1Type],List[Float]) = ???
def getSliceAtIndexLocation(i: Dim1Type)(implicit
di: DummyImplicit): (List[Dim0Type],List[Float]) = ???
}
或type class模式
case class Indexed2dArr[Dim0Type,) {
def getSliceAtIndexLocation[A](i: A)(implicit tc: TC[A]): tc.Out = tc(i)
trait TC[A] {
type B
type Out = TC.MkOut[B]
def apply(i: A): Out
}
object TC {
type MkOut[B] = (List[B],List[Float])
type Aux[A,B0] = TC[A] { type B = B0 }
def instance[A,B0](f: A => MkOut[B0]): Aux[A,B0] = new TC[A] {
override type B = B0
override def apply(i: A): Out = f(i)
}
implicit val dim0Type: Aux[Dim0Type,Dim1Type] = instance(i => ???)
implicit val dim1Type: Aux[Dim1Type,Dim0Type] = instance(i => ???)
}
}
或magnet模式
import scala.language.implicitConversions
case class Indexed2dArr[Dim0Type,) {
def getSliceAtIndexLocation(m: Magnet): m.Out = m()
trait Magnet {
type B
type Out = Magnet.MkOut[B]
def apply(): Out
}
object Magnet {
type MkOut[B] = (List[B],List[Float])
type Aux[B0] = Magnet { type B = B0 }
def instance[B0](x: MkOut[B0]): Aux[B0] = new Magnet {
override type B = B0
override def apply(): Out = x
}
implicit def dim0Type(i: Dim0Type): Aux[Dim1Type] = instance(???)
implicit def dim1Type(i: Dim1Type): Aux[Dim0Type] = instance(???)
}
}