如何将Any传递给泛型方法?

时间:2018-07-23 16:39:02

标签: scala generics reflection generic-collections

我有一个类来封装和展平一个通用类(以便包含不同的通用类型实例的列表):

trait XFun [P,V] {
  def apply(args: P): V
}

class XRoute (val handler: XFun[_,_])

class XRoutes (val routes: List[XRoute])

这样,当我创建XRoutes时,它可以包含具有不同通用类型的XFun列表:

val routes = new XRoutes (List[XRoute](new XRoute(new XFun[Int,Int] {
  def apply[Int,Int](args: Int) = 0
}), new XRoute(new XFun[String, String] {
  def apply[String, String](args: String) = ""
}
))

但是,当我尝试调用它时,会引起问题:

def parse(str: String) : Any = {/* impl */}

val inputObj = parse(inputString)
val outputObj = routes(1).handler.apply(inputObj)

这会在应用行上出现错误:

Type mismatch, expected: _$1, actual: Any

目前,我唯一的解决方案是从MethodSymbol创建一个反射方法并使用reflectedMethod进行调用,但是如何在没有反射的情况下实现呢?

请注意,我不想将XFun更改为apply(Any):Any,因为我想在前端键入强制(例如,在创建XRoute对象时,我想做XFun[String,String]而不是做XFun[Any,Any])。

1 个答案:

答案 0 :(得分:1)

首先,我认为您的特征定义类型太多,应该为:

trait XFun [P,V] {
  def apply(args: P): V
}

然后您可以使用asInstanceOf投射对象:

routes(1).handler.asInstanceOf[XFun[Any,Any]].apply(inputObj)

请注意,这不是安全类型,如果将错误类型的参数传递给XFun,则会在运行时失败。