鉴于以下内容:
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
^
在编译时,不知道Boy
和Girl
是Parent, i.e. A
的唯一子类吗?
答案 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
即。 res2
是Object
而res1
是Parent
。
就像评论中提到的Lee一样,在您的代码中,您希望在A
为Girl.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