【发布时间】:2015-01-15 02:36:04
【问题描述】:
我正在使用一个库,它的类具有一个可能非常复杂的泛型类型。我需要编写一个方法,该方法采用库类的 val 具有的泛型类型的参数,并且我想避免在方法签名中写出类型。我想我可能能够创建一个隐式类,它将一个类型添加到我可以在方法签名中使用的 val 中,有点像:
// 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)
}
我是否缺少一些可以使这项工作正常进行的东西,或者这种隐式转换不是有效的 Scala?
【问题讨论】:
-
有趣的问题!但是为什么你不能只写
doStuff(something: Int): Unit,因为你在你的例子中默认为Int? -
我可以,但问题是这与 Play Anorm DB 的东西有关,所以类型更像 ~[~[~[~[Int, Boolean], String], String], Int ]](这是一个有点简单的表),我试图想办法不必为我们数据库中的每个表都写出来。我只是觉得编译器应该知道类型,那为什么还要自己写出来呢?
-
您能否在您的问题中添加一个真实示例,以及您希望简化的内容。
LibraryClassWithType是~[~[~[~[Int, Boolean], String], String], Int]]野兽吗?这也可能是 异常 相关问题?
标签: scala