2015-01-14 2 views
2

매우 복잡 할 수있는 제네릭 형식의 클래스가있는 라이브러리를 사용하고 있습니다. 라이브러리 클래스의 val에있는 generic 형식의 매개 변수를 사용하는 메서드를 작성해야하며 메서드 서명에 형식을 쓰지 않아도됩니다.제네릭 형식을 사용하기위한 암시 적 변환

// This comes from a library and can't be changed 
case class LibraryClass[A](a: A) 

//---------------------------------- 

object MyCode { 
    val thing = LibraryClass(3) 

    implicit class LibraryClassWithType[A](lc: LibraryClass[A]) { 
    type TheType = A 
    } 

    def doStuff(something: thing.TheType): Unit = { 
    println(something) 
    } 
} 

이 컴파일되지 않습니다 (TheType이 LibraryClass의 구성원이 아닌 : 나는 종류의 좋아, 내가 메서드 서명에 사용할 수있는 발에 유형을 추가하는 암시 적 클래스를 만들 수있을 거라고 생각). 나는 수업 시간에 싸서 자신한다면, 그것은

val thingWithType = LibraryClassWithType(thing) 
    def doStuff(something: thingWithType.TheType): Unit = { 
    println(something) 
    } 

내가 그이 일을 할 것입니다 놓친 거지 뭔가가 있는가, 또는 유효하지 스칼라 암시 적 변환이 종류의 작동?

+0

흥미로운 질문을! 그렇다면 왜 당신의 예제에서'Int'를 기본값으로 사용하여'doStuff (something : Int) : Unit'을 쓸 수 없습니까? – phadej

+0

하지만 문제는 Play Anorm DB와 관련되어 있으므로 유형이 ~ [~ [~ [~ [Int, Boolean], String], String], Int]]와 비슷합니다. 다소 단순한 테이블) 나는 우리 DB에있는 모든 테이블에 대해 그것을 쓰지 않아도되는 방법을 생각하려고 노력했다. 나는 컴파일러가 타입을 알아야한다고 느꼈다. 그래서 왜 그것을 스스로 작성해야만 하는가? –

+0

질문에 실제 예제를 추가하고 단순화하고자하는 것이 있습니까? 'LibraryClassWithType'' ~ [~ [~ [~ [Int, Boolean], String], String], Int]]'짐승? 또한 이것은 * anorm * 관련 질문 일 수 있습니까? – phadej

답변

0

나는 implicits으로 이런 종류의 일을 할 수 없었다,하지만 난 그냥 형 홀더의 이러한 종류의 인스턴스 비슷한으로 필요했던 :

case class LibraryClass[A](a: A) 

object MyCode { 
    val thing = LibraryClass(3) 

    class HigherTypeHolder[A,F[A]](a: F[A]) { 
    type AT = A 
    } 
    val th = new HigherTypeHolder(thing) 

    def doStuff(something: th.AT): Unit = { 
    println(something) 
    } 
} 
+1

나는 타입을 추가하기 위해 좀 더 일반적인 클래스를 갖고있는 것을 좋아한다. 단지 암시 적으로 변환 될 수 있다면 ... –

+0

그래,이 해결 방법이 필요하지 않아야한다고 생각하는 재미있는 상황 중 하나입니다. – experquisite

0

당신은 당신이 이렇게 원하는 (내가 생각하는) 일을 할 수 있습니다

implicit val thing = LibraryClass(3) 
def doStuff[A](something: A)(implicit lc: LibraryClass[A]) 

는 내가 이해하지 못하는 것은이 너무 복잡 할 필요가있는 이유. 왜, 예를 들어 두 번째 접근 방식을 고집하지 않고, 함축적으로 작동하지 않습니까? 아니면 그냥 def doStuff[A](something: A)으로 시작하는 것이 좋을까요?

+0

음, 암시 적 매개 변수가 도움이 될 것이라고 생각하지 않습니다. 왜냐하면이 코드는 코드의 다른 곳에서 호출 될 것이고 범위에서 가져온 같은 유형의 LibrayClass가 둘 이상있을 수 있기 때문입니다. 네, 그것이 작동하기 때문에 나는 함축없이 그것을 할 수 있습니다. 아마 암묵적인 변환이 작동하지 않는 이유에 대해 궁금해 할 것 같습니다. 그것이 저에게 효과가있는 것처럼 보입니다. –

+0

나는'def doStuff [A] (something : A) (lc : LibraryClass [A] = 물건)'에 대해 어떻게 생각합니까? – Dima