3

Querydsl での Scala サポートを改善していますが、次の問題が発生しました。問題を示すコード スニペットを次に示します。

// 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

型引数に加えて、暗黙的な変換で型を一致させる方法。どちらかを個別に一致させることはできますが、両方を一致させることはできません。

4

2 に答える 2

4

この特定のケースでは、次の変更が機能します。

implicit def toAdapter[T, R <: RelationalPath[T]](p: RelationalPath[T] with R) = 
  new RelationalPathAdapter[T,R](p)
于 2011-11-19T19:03:44.000 に答える
3

これは実際には暗黙の変換の問題ではなく、型推論の問題です。toAdapter(path)を呼び出すとき、暗黙的なことは何もありません。

typeパラメーターを渡すと、機能します。

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)
于 2011-11-19T19:05:03.580 に答える