почему я вижу, что абстрактный тип T в шаблоне типа не отмечен, поскольку он устраняется путем стирания, хотя у меня есть теги типа и класса

У меня есть код, который извлекает значения из карты, которую я назвал псевдонимом:

type CsvRow = Map[String, Any]

и класс экстракции:

class CsvExtractor(row: CsvRow) extends Extractor {
  def get[T: TypeTag: ClassTag](k: String): T = getOption[T](k).get

  def getOption[T: TypeTag: ClassTag](k: String): Option[T] = {
    row(k) match {
      case v: Some[T] => v
      case None       => None
    }
  }
}

Компилятор выдает мне это предупреждение:

[warn] /Users/axue/workspace/events/schema-kontrol/src/main/scala/com/lumoslabs/schemakontrol/core/extractor/CsvExtractor.scala:12: abstract type T in type pattern Some[T] is unchecked since it is eliminated by erasure
[warn]       case v: Some[T] => v
[warn]               ^

Но разве ClassTag и TypeTag не должны гарантировать, что эта информация о типе существует?


person hiroprotagonist    schedule 06.01.2017    source источник


Ответы (1)


Это связано с тем, что вы помещаете это в определение класса обобщения. Попробуйте изменить на следующее:

case Some(v: T) => v
person LynxZh    schedule 06.01.2017