【问题标题】:Ambiguous Class level and inherited method level ClassTag模糊类级别和继承方法级别 ClassTag
【发布时间】:2014-11-19 12:12:21
【问题描述】:

我有一个特性,需要一个带有 ClassTag 的函数

trait Foo[T] {
    def bar(a: List[T])(implicit ev: ClassTag[T]): Unit
}

现在我有一个需要扩展该特征的类,但它的 ClassTag 也可用于其他方法,例如

class MyClass[T](implicit classTag: ClassTag[T]) extends Foo[T] {
    override def bar(a: List[T])(implicit ev: ClassTag[T]): Unit = { /* do stuff */ }
    def other(p: Map[String, T]) = /* other stuff where I need the ClassTag */
}

编译后,我收到一条错误消息:

Error:scalac: ambiguous implicit values:
both value classTag in class MyClass of type scala.reflect.ClassTag[T]
and value ev of type scala.reflect.ClassTag[T]
match expected type scala.reflect.ClassTag[T]

有没有一种方法可以同时容纳类级别的 ClassTag 并覆盖父 trait 的方法?

【问题讨论】:

    标签: scala inheritance implicits


    【解决方案1】:

    你可以简单地给他们两个取相同的名字。

    【讨论】:

    • 哇,没看到那个来了。我什至不知道为什么这是有道理的,但是谢谢。
    • 这样考虑:在您的情况下,编译器可以在需要隐式的地方插入classTagev,但它不知道该选择哪个。如果它们的名称相同,则它不能引用构造函数参数(它被方法参数遮蔽),因此对于隐式解析它不被认为是可见的。
    • 这实际上是有道理的。这就像对自己使用编译器。
    猜你喜欢
    • 1970-01-01
    • 2016-02-07
    • 1970-01-01
    • 2012-01-28
    • 2012-07-05
    • 2012-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多