【问题标题】:Implicit conversion issue in ScalaScala中的隐式转换问题
【发布时间】:2012-01-02 00:48:44
【问题描述】:

我正在改进 Querydsl 中的 Scala 支持,但遇到了以下问题。这是一个说明问题的代码sn-p:

// framework types  
class RelationalPath[T]
class RelationalPathAdapter[T, R <: RelationalPath[T]](p: R) { def someMethod = {} }

// domain types
class User  
class QUser extends RelationalPath[User]

implicit def toAdapter[T, R <: RelationalPath[T]](p: R) = new RelationalPathAdapter[T,R](p)

val path = new QUser()

toAdapter(path).someMethod // DOESN'T COMPILE

path.someMethod // DOESN'T COMPILE

除了类型参数之外,如何在隐式转换中匹配类型。我可以单独匹配,但不能同时匹配。

【问题讨论】:

    标签: scala type-inference implicits


    【解决方案1】:

    在这种特定情况下,以下更改有效:

    implicit def toAdapter[T, R <: RelationalPath[T]](p: RelationalPath[T] with R) = 
      new RelationalPathAdapter[T,R](p)
    

    【讨论】:

      【解决方案2】:

      这并不是一个真正的隐式转换问题,而是一个类型推断问题。当您调用 toAdapter(path) 时,没有任何隐含的内容。

      如果你传递类型参数,它就可以工作。

      toAdapter[User, QUser](path).someMethod
      

      它甚至可以使用隐式转换:

       (path: RelationalPathAdapter[User, QUser]).someMethod
      

      当然,这没什么用。

      隐式的正确写法是

      implicit def toAdapter[T, R[X] <: RelationalPath[X]](p: R[T]) 
        = new RelationalPathAdapter[T, R[T]](p)
      

      【讨论】:

      • 它似乎不起作用。试试这个: val conv: RelationalPathAdapter[User,QUser] = toAdapter(path)
      • 仍然,它回答了您原来的问题,就像您可以做的path.someMethod 一样。但好的一点,关于QUser 的信息丢失了,你只有RelationalPathAdapter[User, RelationalPath[User]]。然后就是 Alexey 的解决方案。
      • 是的,我的问题不够明确。不过感谢您的努力。
      猜你喜欢
      • 1970-01-01
      • 2019-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多