ошибка scala: аргументы типа не соответствуют границам параметров типа класса [X>: A, Y>: A] - PullRequest
0 голосов
/ 13 мая 2019

Я пытаюсь определить класс с границами типов.

trait External[T]{
  def deserialize( bytes: Array[Byte] ) : T
}

trait A

case class Hi(i: Int) extends A

class Foo[X >: A] extends External[X] {
   def deserialize(bytes: Array[Byte]) : X = Hi(1)
}

scala> new Foo[Hi]

Но я получаю следующую ошибку:

  <console>:14: error: type arguments [Hi] do not conform to class Foo's type parameter bounds [X >: A]
       val res2 =
           ^

Что я делаю не так?как я могу решить это? РЕДАКТИРОВАТЬ: Если я попытаюсь отменить привязанный Foo [X <: A, Y <: A], я получу следующую ошибку: </p>

 scala> class Foo[X <: A]{
      def deserialize(bytes: Array[Byte]): X = Hi(1)
      }
<console>:13: error: type mismatch;
 found   : Hi


required: X
          def deserialize(bytes: Array[Byte]): X =Hi(1)
                                                    ^

Я могу решить ееделать:

class Foo[X <: A]{
          def deserialize(bytes: Array[Byte]): X = a.asInstanceOf[X]
          }

Это идиоматический способ или есть лучший?

Ответы [ 2 ]

0 голосов
/ 13 мая 2019

class Foo[X >: A, Y >: A] ожидает супертипы A, но Hi является подтипом A, поскольку расширяет его.

class Foo[X <: A, Y <: A]

правильный путь

0 голосов
/ 13 мая 2019

Прямо сейчас ваши ограничения типа говорят "для типов X и Y, которые являются суперклассами A". Если вам нужны подклассы A, вам нужно изменить границы типа на [X <: A, Y <: A]. Вот пример, который компилируется:

trait A
trait B extends A
trait C extends A
case class Foo[X <: A, Y <: A](x: X, y: Y)
case class Hi(i: Int) extends A

Foo(Hi(1), Hi(2))
...