2011-11-19 3 views
3

Querydsl의 스칼라 지원 기능이 개선되어 다음과 같은 문제가 발생했습니다. 다음은 문제를 설명하는 코드입니다.스칼라에서 암시 적 변환 문제가 발생했습니다.

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

작동하지 않는 것 같습니다. 이것을 시도해보십시오 : val conv : RelationalPathAdapter [User, QUser] = toAdapter (path) –

+0

그래도'path.someMethod'처럼 원래 질문에 답해줍니다. 하지만 좋은 점은'QUser'에 대한 정보가 없어 졌기 때문에 RelationalPathAdapter [User, RelationalPath [User]] 만 있습니다. 알렉세이의 해결책은 그 때입니다. –

+0

예, 제 질문이 충분하지 않습니다. 그래도 고마워. –