我试图定义一个带有类型边界的类。
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]
}
是惯用的方法还是更好的方法?
答案 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
的超类型,但是Hi
是A
的子类型,因为它对其进行了扩展。
class Foo[X <: A, Y <: A]
是正确的方法