如何摆脱:需要类类型但找到 T [英] How to get rid of : class type required but T found
本文介绍了如何摆脱:需要类类型但找到 T的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
如何解决这个编译错误:
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)
}
这里是错误:
[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
:
T
is not a class type, but a type parameter. Request a 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!
所以你必须修改基类来声明get
如下:
So you have to modify the base class to declare get
as follows:
def get[T: ClassTag]: Seq[T]
这篇关于如何摆脱:需要类类型但找到 T的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文