我有不同的来源和相应的参数Scala的设计使用反射,隐式和泛型
Source1的,源2,Source3
参数1,参数,参数3,
来源:是性状(可改变)
trait Source[T] {
def get(Parameter)(implicit c: Context): MyData[T]
}
参数也是一个特点
trait Parameter
我有不同的输出类型类:T1,T2,T3
我需要作为输出:迈德特[输出类型]
固定API签名(更改签名不太优选):
val data1: MyData[T1] = MyAPI.get[T1](Parameter1("a", "b")) // this should give MyData from Source1 of type T1
val data2: MyData[T2] = MyAPI.get[T2](Parameter3(123)) // this should give MyData from Source3 of type T2
某些源支持某些输出类型(比如T1,T2),但有些可能不支持。
我做了什么: 我试过使用scala反射typeTag来确定运行时的类型,但由于返回类型是MyData [T],并且处于contra-variant位置,所以不知道实际的返回类型。 (Why does TypeTag not work for return types?) 例如
object MyAPI {
get[T: TypeTag](p: Parameter)(implicit c: Context): MyData[T] = {}
}
我也试过使用类型模式。 Scala TypeTag Reflection returning type T 我可以使用不同的OutputType为每个创建隐式val,但仅适用于单个Source1。我无法为所有来源工作。
我试图做的事:
object MyAPI {
get[T: SomeConverter](p: Parameter)(implicit c: Context): MyData[T] = {
p match {
case Parameter1 => Source1[T].read(p.asInstanceOf(Parameter1)
case Parameter2 => Source2[T].read(p.asInstanceOf(Parameter2)
}
}
}
请您尝试更清楚地说明您正在尝试做什么?对我来说,你假设读者太多。给出一些你的类型的例子,也许有更多的代码缺失部分(例如,'Parameter'看起来像什么) –