首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将Any传递给泛型方法?

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

Stack Overflow用户
提问于 2018-07-24 00:39:02
回答 1查看 41关注 0票数 0

我有一个封装和扁平化泛型类的类(为了包含不同泛型类型实例的列表):

代码语言:javascript
复制
trait XFun [P,V] {
  def apply(args: P): V
}

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

class XRoutes (val routes: List[XRoute])

因此,当我创建XRoutes时,它可以包含具有不同泛型类型的XFun列表:

代码语言:javascript
复制
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) = ""
}
))

但是,当我尝试调用它时,它会导致问题:

代码语言:javascript
复制
def parse(str: String) : Any = {/* impl */}

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

这将在应用行上显示错误:

代码语言:javascript
复制
Type mismatch, expected: _$1, actual: Any

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-24 01:07:03

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

代码语言:javascript
复制
trait XFun [P,V] {
  def apply(args: P): V
}

然后,您可以使用asInstanceOf强制转换对象

代码语言:javascript
复制
routes(1).handler.asInstanceOf[XFun[Any,Any]].apply(inputObj)

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51483589

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档