scala - 如何摆脱 : class type required but T found

标签 scala

如何解决此编译错误:

trait Container {
  def getInts() : Seq[Int]
  def getStrings() : Seq[String]

  def put[T](t: T)
  def get[T] : Seq[T]
}

class MutableContainer extends Container {
  val entities = new mutable.HashMap[Class[_], mutable.Set[Any]]() with mutable.MultiMap[Class[_], Any]

  override def getStrings(): Seq[String] = entities.get(classOf[String]).map(_.toSeq).getOrElse(Seq.empty).asInstanceOf[Seq[String]] //strings
  override def getInts(): Seq[Int] = entities.get(classOf[Int]).map(_.toSeq).getOrElse(Seq.empty).asInstanceOf[Seq[Int]]

  override def get[T]: Seq[T] = entities.get(classOf[T]).map(_.toSeq).getOrElse(Seq.empty).asInstanceOf[Seq[T]]
  override def put[T](t: T): Unit = entities.addBinding(t.getClass, t)
}

这是错误:
[error] Container.scala:23: class type required but T found
[error]       override def get[T]: Seq[T] = entities.get(classOf[T]).map(_.toSeq).getOrElse(Seq.empty).asInstanceOf[Seq[T]]

最佳答案

T不是类类型,而是类型参数。请求 ClassTag :

import scala.reflect._

override def get[T](implicit ct: ClassTag[T]): Seq[T] =
  entities.get(ct.runtimeClass)
          .map(_.toSeq)
          .getOrElse(Seq.empty)
          .asInstanceOf[Seq[T]]

但这又带来了另一个问题;这不是覆盖!

所以你必须修改基类来声明get如下:
def get[T: ClassTag]: Seq[T]

关于scala - 如何摆脱 : class type required but T found,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26567370/

相关文章:

scala - 使用 Scala 和 Dispatch 获取 HTTP 响应作为 Array[Byte]

scala - 为什么Unit可以赋值给一个Tuple而不会出现编译错误?

scala - 烫伤:从单独的文件中添加特征

scala - 如何在 Scala 中将 InputStream 转换为 base64 字符串?

scala - Akka-http中获取客户端IP

泛型不是那么通用!

scala - 为什么 `scala.util.Try` 书 "Handling errors without exceptions"的第 "functional programming in Scala"章中没有提到 0x104567910 ?

unit-testing - 在 ScalaTest 中 `should` 、 `can` 、 `must` 之间有什么区别

javascript - Scala.js:对象文字,键名中有冒号

scala - 自定义 Scala REPL 问题