scala 如何摆脱:需要类类型但找到了 T

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/26567370/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-22 06:39:08  来源:igfitidea点击:

How to get rid of : class type required but T found

scala

提问by Yann Moisan

How to solve this compilation error :

如何解决这个编译错误:

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)
}

Here is the error :

这是错误:

[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]]

回答by rightfold

Tis not a class type, but a type parameter. Request a ClassTag:

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]]

But this brings another problem; this is not an override!

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

So you have to modify the base class to declare getas follows:

所以你必须修改基类来声明get如下:

def get[T: ClassTag]: Seq[T]

回答by mohit

A solution without reflection

没有反射的解决方案

trait Container {
  def getInts() : Seq[Int]
  def getStrings() : Seq[String]
  def put[T](clazz: Class[T],t :T)
  def get[T](clazz: Class[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](clazz: Class[T]): Seq[T] = entities.get(clazz).map(_.toSeq).getOrElse(Seq.empty).asInstanceOf[Seq[T]]
  override def put[T](clazz: Class[T],t :T): Unit = entities.addBinding(clazz, t)
}