scala错误:类型参数不符合类类型参数范围[X>:A,Y>:A]

时间:2019-05-13 13:24:25

标签: scala generics subtype subtyping

我试图定义一个带有类型边界的类。

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],那么我将得到以下错误:

 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 :(得分:0)

现在,您的类型约束说“对于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))

答案 1 :(得分:0)

class Foo[X >: A, Y >: A]期望A的超类型,但是HiA的子类型,因为它对其进行了扩展。

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

是正确的方法