【问题标题】:No ClassTag available despite ClassTag defined尽管定义了 ClassTag,但没有可用的 ClassTag
【发布时间】:2016-04-26 14:37:03
【问题描述】:

我有以下代码:

trait MyTrait[B] {
  def func()
}

class A[B: ClassTag : Zero](val x: SparseVector[B]) extends MyTrait[B] {
  def this(x: Seq[(Int,B)]) = this({
    val (index, vals) = x.unzip
    vals.toArray
    new SparseVector[B](index.toArray, vals.toArray, vals.length)
  })

  def func(): Unit = {}
}

尽管 ClassTag 已添加到泛型参数中,但仍会获得 error: No ClassTag available for B。我错过了什么?

SparseVector 以上是微风线性代数包的成员(breeze.linalg

【问题讨论】:

  • import scala.reflect.ClassTag ?
  • 好吧,如果我定义MyTrait,这对我来说编译得很好。
  • 代码运行正常(去掉未知的extends MyTrait[B]),是特征代码中引发的错误吗?
  • 我把我的例子过于简单化了。请参阅上面的更新版本。

标签: scala generics implicit scala-breeze


【解决方案1】:

问题是上下文边界(它只是作为隐式参数被取消),不适用于辅助构造函数。您需要明确(哈哈)声明参数列表:

def this(x: Seq[(Int,B)])(implicit z: Zero[B], ct: ClassTag[B]) = ...

这感觉像是编译器中的一个错误,但我可以看到它是双向的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-02
    • 1970-01-01
    • 1970-01-01
    • 2015-12-11
    • 2022-10-16
    相关资源
    最近更新 更多