2011-11-19 108 views
3

我正在改進Querydsl中的Scala支持,並遇到以下問題。下面是一個代碼片段,說明了這個問題: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

在這種特定的情況下,以下變化工作:

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

感謝。這確實有訣竅! –

3

這是不是一個真正的隱式轉換的問題,而是一個類型推斷的問題。當你調用適配器(路徑)時,沒有任何隱含的。

如果你傳遞了類型參數,它就起作用了。

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) 
+0

它似乎沒有工作。試試這個:val conv:RelationalPathAdapter [User,QUser] = toAdapter(path) –

+0

儘管如此,它仍然可以解決你原來的問題,就像你可以做'path.someMethod'一樣。但很好,關於'QUser'的信息丟失了,你只有'RelationalPathAdapter [User,RelationalPath [User]]'。那麼阿列克謝的解決方案就是這樣。 –

+0

是的,我的問題不夠明確。感謝您的努力。 –