Ограничения универсального типа Scala и специализированное поведение - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть класс, где мне нужен метод apply[T], где T может быть только Foo или Bar. Кроме того, метод должен вести себя по-разному в зависимости от того, является ли он Foo или Bar. Из-за стирания типа я не могу просто создать методы apply[Foo] и apply[Bar] (это была моя первая попытка). Чтобы решить эту проблему, я попытался сделать что-то вроде этого

def apply[T](ds: Dataset[T]): Dataset[T] = { 
    ds match {
        case ds: Dataset[Foo] => ...
        case ds: Dataset[Bar] => ...
        case _ => ???
    }
}

но это не работает из-за стирания типа T. Кроме того, это даже не ограничивает возможность вызова этого метода только с T типа Foo или Bar, он просто «ничего не делает», когда он не относится к одному из этих двух типов. Как я могу заставить этот метод применять иметь эти свойства?

Спасибо.

Ответы [ 2 ]

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

Вот хороший трюк при удалении типа:

def apply(ds: Dataset[Foo]): Dataset[Foo] = ???
def apply(ds: Dataset[Bar])(implicit dummy: DummyImplicit): Dataset[Bar] = ???

Позволяет использовать несколько методов с одной и той же сигнатурой времени выполнения без использования параметров типа.

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

Вы можете использовать неявный класс типов:

trait Baz[T] {
  def apply(ds: DataSet[T]): DataSet[T]
}

implicit val fooImpl = new Baz[Foo] {
  def apply(ds: DataSet[Foo]): DataSet[Foo] = ???
}

implicit val barImpl = new Baz[Bar] {
  def apply(ds: DataSet[Bar]): DataSet[Bar] = ???
}

def apply[T](ds: Dataset[T])(implicit b: Baz[T]): Dataset[T] = b(ds)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...