【问题标题】:Wrong usage of Classtag in Scala?Scala中Classtag的错误用法?
【发布时间】:2022-01-26 18:33:12
【问题描述】:
import scala.reflect.ClassTag


class IntStorage {
  var variable: Int = 5
}


class testing[T : ClassTag] {
  var example = Array.ofDim[T](10, 10)
  def testFunc(): Int = example(0)(0).variable
}

错误:值变量不是 T 的成员

我不明白为什么会收到此错误,即使我使用了 Classtag。

【问题讨论】:

  • 为什么你还有一个通用的?为什么不直接使用IntStorage?另外,为什么要使用Array 而不是真正的收藏?
  • 这只是一个虚构的例子来说明问题。
  • 好吧,您可能会显示更多代码以查看真正的问题。无论如何,似乎 Silvio 的答案就是您想要的。 - PS:不使用Arrays 的建议仍然有效。

标签: scala class


【解决方案1】:

ClassTag 很好。但是您声明 testingany 类工作,而不仅仅是 IntStorage。如果我打电话给new testing[String]()怎么办? String 是一个带有类标签的完全有效的类,但它没有 variable 字段。我可以用任何类来调用它。

你的意思是不是

class testing[T <: IntStorage : ClassTag] { ... }

【讨论】:

  • 谢谢。我也试过了,但我得到了错误:"] 预期但 <: found>
  • 尝试其他排列。 T &lt;: IntStorage : ClassTag。 Scala 对这些顺序变化无常,我总是把它倒过来。我的错!
  • 我知道这是一个完全不同的问题,但是如果 IntStorage 是一个抽象类并且它的某些子类具有 IntStorage 中未定义的功能怎么办?如果我尝试从测试中调用这些函数,我会得到预期的错误。有没有办法解决这个问题还是不可能?
  • @HeloKitay 那么你不能调用这些函数,因为这样做会破坏 Liskov。您要么需要声明一个新接口,要么使用类型类,或者将其设为 ADT 并使用模式匹配。如果没有更多上下文,很难提供最佳替代方案。
  • @HeloKitay 我建议您仔细用文字表述您的问题,然后再问一个关于它的 SO 问题。一旦完全制定,这听起来像是一个有趣的问题,但答案的评论部分可能不是解决这个问题的最佳位置。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多