代码之家  ›  专栏  ›  技术社区  ›  SwiftMango

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

  •  0
  • SwiftMango  · 技术社区  · 8 年前

    我有一个类,它包含并展开一个泛型类(以便包含不同的泛型类型实例的列表):

    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 回复  |  直到 8 年前
        1
  •  1
  •   Joe K    8 年前

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

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

    然后你可以用 asInstanceOf :

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

    请注意,这不是类型安全的,如果将错误类型的参数传递给 XFun .