Scala: класс универсального - PullRequest
1 голос
/ 29 апреля 2019

Я хочу загрузить и проанализировать файл JSON с помощью scala 2.11.8, в общем виде, например:

private val objectMapper = new ObjectMapper with ScalaObjectMapper
objectMapper.registerModule(DefaultScalaModule)

def loadFile[T](path: Path): Try[T] = Try(
  objectMapper.readValue(Files.readAllBytes(path), classOf[T])
)

Тогда цель состоит в том, чтобы вызвать метод loadFile только с ожидаемым типом возвращаемого значения.

Однако это возвращает меня:

class type required but T found

По поиску, я нашел ссылки на стирания, манифесты, ClassTag, но ничего не работает. Какое правильное решение?

1 Ответ

3 голосов
/ 29 апреля 2019

Универсальный тип стирается, поэтому вам нужно ClassTag, чтобы он заработал.Вот как вы можете их использовать:

def loadFile[T: ClassTag](path: Path): Try[T] = Try(
  objectMapper.readValue(
    Files.readAllBytes(path),
    implicitly[ClassTag[T]].runtimeClass.asInstanceOf[Class[T]])
)

(По какой-то причине runtimeClass не имеет универсального типа, поэтому вам нужен приведение.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...