【问题标题】:Implicit conversion to make generic type available隐式转换以使泛型类型可用
【发布时间】: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


【解决方案1】:

我无法用隐式做这种事情,但我不得不做一些类似的事情,我刚刚实例化了这些类型的持有者:

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)
  }
}

【讨论】:

  • 我喜欢你有一个更通用的类来添加类型,这很酷。要是能隐式转换就好了……
  • 是的,我也是,这是一种有趣的情况,你真的觉得这种解决方法不应该是必要的。
【解决方案2】:

你可以像这样(我认为)做你想做的事:

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

我不明白为什么这需要如此复杂。例如为什么不坚持你的第二种方法,没有隐含,那行得通,或者为什么不直接做 以def doStuff[A](something: A) 开头?

【讨论】:

  • 嗯,我认为隐式参数不会有帮助,因为此代码将从代码中的其他位置调用,并且可能有多个具有相同类型的 LibrayClass 在范围内导入。我可以在没有隐含的情况下做到这一点,因为是的,它确实有效。我想我可能只是好奇为什么隐式转换不起作用,它似乎对我有用。
  • 我明白了……def doStuff[A](something: A)(lc: LibraryClass[A] = thing) 怎么样?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-10
  • 2013-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-12
相关资源
最近更新 更多