如何将 Any 传递给泛型方法?
How to pass Any to a generic method?
我有一个 class,它包含并展平了一个泛型 class(以便包含不同泛型类型实例的列表):
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: _, actual: Any
目前我唯一的解决方案是从 MethodSymbol
创建一个反射方法并使用 reflectedMethod
调用,但我如何在没有反射的情况下实现这一点?
请注意,我不想将 XFun
更改为 apply(Any):Any
,因为我想在前端强制执行(例如,在创建 XRoute 对象时,我想改为 XFun[String,String]
不得不做 XFun[Any,Any]
).
首先我认为你的特征定义有太多类型,应该只是:
trait XFun [P,V] {
def apply(args: P): V
}
然后您可以使用 asInstanceOf
:
来转换对象
routes(1).handler.asInstanceOf[XFun[Any,Any]].apply(inputObj)
请注意,这不是类型安全的,如果您将错误类型的参数传递给 XFun
,将会在运行时失败。
我有一个 class,它包含并展平了一个泛型 class(以便包含不同泛型类型实例的列表):
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: _, actual: Any
目前我唯一的解决方案是从 MethodSymbol
创建一个反射方法并使用 reflectedMethod
调用,但我如何在没有反射的情况下实现这一点?
请注意,我不想将 XFun
更改为 apply(Any):Any
,因为我想在前端强制执行(例如,在创建 XRoute 对象时,我想改为 XFun[String,String]
不得不做 XFun[Any,Any]
).
首先我认为你的特征定义有太多类型,应该只是:
trait XFun [P,V] {
def apply(args: P): V
}
然后您可以使用 asInstanceOf
:
routes(1).handler.asInstanceOf[XFun[Any,Any]].apply(inputObj)
请注意,这不是类型安全的,如果您将错误类型的参数传递给 XFun
,将会在运行时失败。