【发布时间】:2020-12-29 17:22:45
【问题描述】:
我试图让一个方法返回一个必须实现类型类的值,我认为它更普遍地向我强调了我如何不理解 Scala 的通用参数解析过程。我有这样的情况:
trait IsContainer[A, T] {
def getOtherContainer[O](implicit tc2: IsUnit[O]): O
}
trait IsUnit[A] { }
implicit val anIntIsUnit = new IsUnit[Int] { }
implicit def aListIsContainer[T] = new IsContainer[List[T], T] {
def getOtherContainer[Int] = 3
}
这会引发编译错误:Missing implementation for: def getOtherContainer。我对这里应该发生的事情的无知猜测是 Scala 看到我已经传递了泛型参数 O,并认为如果 O 类型的所有实例都一致,则该方法已实现。所以在这种情况下(因为我已经明确告诉它O = Int,它会检查范围内是否存在IsUnit[Int] 的实例,并且方法的输出类型是O 类型。如果这是正确的(我不是说它是!)那为什么这不起作用?
更一般地说,如果我跳过 [O] 泛型参数并让它猜测 - 所以我只是用 getOtherContainer = 3 实现了该方法 - 我是否也应该期望它工作?要推断O 应该是什么,它是否会扫描该行并查看O 是否已在提到的三个位置中的任何一个中具体填写,并从中推断?
谢谢!
【问题讨论】:
-
@cchantep - 哈哈 - 这实际上是我自己的问题。确实可以,但解决方案依赖于定义一个已经在特征中定义的抽象类型,这并不完全适合这种情况。
标签: scala generics typeclass implicit