Класс case .copy с верхним значением - PullRequest
1 голос
/ 23 января 2020

У меня проблемы с использованием метода .copy класса case, который имеет значение верхней границы. Пример примерно такой:

sealed abstract class SomeOtherClass[A <: SomethingElse]{...}

final case class SomeClass[LI <: SomeOtherClass[_]](
    value1: String,
    value2: LI)

А в другой части моего кода у меня есть:

val instance: SomeClass(_) = service.getInstance()
...
instance.copy(value1 = "Something new")

Но когда я пытаюсь позвонить в мой код, я получаю сообщение об ошибке строки:

type mismatch;
[error]  found   : List[_$2]
[error]  required: List[LI]

Вопрос в том, есть ли способ использовать метод .copy для чего-то подобного? Или какой рекомендуемый способ сделать это?

1 Ответ

2 голосов
/ 23 января 2020

Попробуйте ограничить экзистенциальный тип следующим образом:

val instance: SomeClass[_ <: SomeOtherClass[_]] = service.getInstance()

, соответствующий LI <: SomeOtherClass[_]. Например,

trait Animal
case class Cat() extends Animal
case class Dog() extends Animal

sealed abstract class House[A <: Animal](a: A)
case class DogHouse(dog: Dog) extends House(dog)
case class CatHouse(cat: Cat) extends House(cat)

final case class SomeClass[LI <: House[_]](value1: String, value2: LI)

val instance: SomeClass[_ <: House[_]] = SomeClass("Floppy", DogHouse(Dog()))
instance.copy(value1 = "Something new") // res0: SomeClass[_$2] = SomeClass(Something new,DogHouse(Dog()))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...