Как работать с HKT-типами при сопоставлении с образцом, когда вы используете ключевое слово «type» для их создания? - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть этот код и, конечно, во время компиляции у меня есть эта ошибка

... не проверяется, так как она устранена картой случая стирания: MapWithObject => value (map, path, index+ 1)

Как изменить регистр соответствия шаблону, чтобы избавиться от этого сообщения?

type MapWithObject = java.util.HashMap[String, Object]

def value[T : ClassTag](parsedMap: MapWithObject,
                        path: String,
                        index: Int = 0): Option[T] = {
    val key = if (path.contains(".")) path.split("\\.")(index) else path
    parsedMap.asScala.get(key).flatMap({
        case value: T => Some(value)
        case map: MapWithObject => value(map, path, index + 1)
        case _ => None
    })
} 

1 Ответ

0 голосов
/ 28 сентября 2018

Чтобы избавиться от unchecked -предупреждений, используйте @unchecked (поскольку у вас уже есть практически нетипизированные Object s, которые летают повсюду, аннотация @unchecked не делает его хуже):

import scala.reflect.ClassTag
import scala.collection.JavaConverters._
import java.util.{HashMap => JHashMap}

type MapWithObject = JHashMap[String, Object]

def value[T: ClassTag](
  parsedMap: MapWithObject,
  path: String,
  index: Int = 0
): Option[T] = {
  val key = if (path.contains(".")) path.split("\\.")(index) else path
  parsedMap.asScala.get(key).flatMap({
    case value: T => Some(value)
    case map: JHashMap[String @unchecked, Object @unchecked] =>
      value(map, path, index + 1)
    case _ => None
  })
}

В качестве средства для длительного java.util.HashMap вы можете использовать переименование импорта HashMap => JHashMap вместо определения типа.

...