매우 복잡 할 수있는 제네릭 형식의 클래스가있는 라이브러리를 사용하고 있습니다. 라이브러리 클래스의 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)
}
내가 그이 일을 할 것입니다 놓친 거지 뭔가가 있는가, 또는 유효하지 스칼라 암시 적 변환이 종류의 작동?
흥미로운 질문을! 그렇다면 왜 당신의 예제에서'Int'를 기본값으로 사용하여'doStuff (something : Int) : Unit'을 쓸 수 없습니까? – phadej
하지만 문제는 Play Anorm DB와 관련되어 있으므로 유형이 ~ [~ [~ [~ [Int, Boolean], String], String], Int]]와 비슷합니다. 다소 단순한 테이블) 나는 우리 DB에있는 모든 테이블에 대해 그것을 쓰지 않아도되는 방법을 생각하려고 노력했다. 나는 컴파일러가 타입을 알아야한다고 느꼈다. 그래서 왜 그것을 스스로 작성해야만 하는가? –
질문에 실제 예제를 추가하고 단순화하고자하는 것이 있습니까? 'LibraryClassWithType'' ~ [~ [~ [~ [Int, Boolean], String], String], Int]]'짐승? 또한 이것은 * anorm * 관련 질문 일 수 있습니까? – phadej