Как ограничить параметры типа методов при создании признаков в Scala - PullRequest
0 голосов
/ 01 апреля 2020
trait A{ 
 def a[K]: Int
}
new A{
  def a[K:SomeTypeClass] = ???
}

Можно ли ограничить параметры типа в методах при реализации признака в Scala? (отредактировано)

Я не хочу через параметризацию черты

Например

trait Service[V] {
  def save(value: V): Task[Unit]
  def read[K](key: K): Task[V]
}

val dynamoDBService = new Service[Person]{
  def save(value: V): Task[Unit] = ???
  def read[K: DynamoDBFormat](key: K): Task[V] = ???
}

dynamoDBService.read[name]("tom")

dynamoDBService.read[Id]("123-123-123")

1 Ответ

0 голосов
/ 02 апреля 2020

Принцип замены Лискова требует, чтобы реализация абстрактной функции принимала все типы, которые принимаются абстрактной функцией.

Чтобы избежать этого, необходимо иметь параметр типа в особенность в том, что разные реализации имеют разные интерфейсы и поэтому не должны соответствовать Лискову.

trait A[TypeClass[_]] {

  def a[K: TypeClass]: Int
}

new A[SomeTypeClass] {
  def a[K: SomeTypeClass]: Int = ???
}

или

trait A {
  type TypeClass[_]

  def a[K: TypeClass]: Int
}

new A {
  type TypeClass[T] = SomeTypeClass[T]

  def a[K: SomeTypeClass]: Int = ???
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...