Полиморфный тип возвращаемого значения с помощью TypeTag в Scala - PullRequest
0 голосов
/ 04 февраля 2019

То, что я хочу сделать, это возвращать универсальный тип в функции Scala с помощью TypeTag.Вот пример кода.

trait Parent[T]

object IntChild extends Parent[Int]
object StringChild extends Parent[String]

object SomeClass {
  def of[A: TypeTag]: Parent[T] = {
    getElementType[A] match {
      case Int => IntChild
      case String => StringChild
    }
  }
}

SomeClass.of[Array[Int]]

Но он выдает ошибку компиляции.Поскольку возвращаемый тип метода of не зафиксирован в типе компиляции.Есть ли способ получить информацию о типе из TypeTag и встроить тип в возвращаемый тип?

То, что я ожидаю, похоже на

// T is inferred from TypeTag A.
def of[A: TypeTag, T]: Parent[T] = {
  //...
}

Я обнаружил, что этот код также не прошел компиляцию,Поэтому нам нужно исправить информацию о типе, выведенную из TypeTag А.

def of[A: TypeTag]: Parent[_] = {
  //...
}

Это ошибка.

type mismatch;
[error]  found   : Array[Int]
[error]  required: Array[_$1]

Как я могу получить тип элемента заранее?

1 Ответ

0 голосов
/ 04 февраля 2019

Я не уверен, что это возможно с этими определениями.Как насчет того, чтобы немного изменить определения?

trait Parent[T]

implicit object IntChild extends Parent[Int]
implicit object StringChild extends Parent[String]

object SomeClass {
  def of[A: Parent]: Parent[A] = implicitly
}

Это гарантирует, что все будет сделано на уровне типа, чтобы вы получили желаемый тип возвращаемого значения.Требуется модификатор implicit для IntChild и StringChild.Нет необходимости иметь другой параметр типа с именем T, так как он всегда будет таким же, как A в вашем примере.

...