类型参数和代数数据类型?

时间:2015-08-11 16:26:47

标签: scala

鉴于以下内容:

scala> sealed trait Parent
defined trait Parent

scala> case object Boy extends Parent
defined object Boy

scala> case object Girl extends Parent
defined object Girl

然后是一种方法:

scala> def foo[A <: Parent](x: Parent): A = {
     |    if(true) Boy else Girl
     | }
<console>:14: error: type mismatch;
 found   : Boy.type
 required: A
          if(true) Boy else Girl
                   ^
<console>:14: error: type mismatch;
 found   : Girl.type
 required: A
          if(true) Boy else Girl
                            ^

在编译时,不知道BoyGirlParent, i.e. A的唯一子类吗?

2 个答案:

答案 0 :(得分:0)

检查一下:

def foo[S >: Parent](p:Parent):S = if(true) Boy else Girl

答案 1 :(得分:0)

使用A >: Parent代替A <: Parent定义方法可能会更清楚地显示您的代码有什么问题:

scala> def foo[A >: Parent](x: Parent): A = { if(true) Boy else Girl }
foo: [A >: Parent](x: Parent)A

scala> foo[Parent](Boy)
res1: Parent = Boy

scala> foo[Object](Boy)
res2: Object = Boy

即。 res2Objectres1Parent

就像评论中提到的Lee一样,在您的代码中,您希望在AGirl.type的情况下调用它,这样签名就会变为:foo[Girl.type](x: Parent): Girl.type但返回类型为您的实施不是Girl.type

以下是使用A <: Parent的代码变体:

scala> def foo[A <: Parent](x: A): A = x 
foo: [A <: Parent](x: A)A

scala> foo[Boy.type](Boy)
res3: Boy.type = Boy