簡體   English   中英

如何擺脫:類型需要但T找到

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

如何解決這個編譯錯誤:

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]

沒有反射的解決方案

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM