【发布时间】:2011-08-05 09:52:06
【问题描述】:
为了说明我的观点,这里举个例子:
abstract class Wrapper[A](wrapped: A) {
protected def someCondition: Boolean
def fold[B](whenTrue: => B)(whenFalse: => B): B =
if (someCondition) whenTrue else whenFalse
}
我正在尝试根据包装类型A 上定义的任意条件添加fold 方法。上面代码的问题是它无法编译,尽管可以想象它可以返回Any:
wrapper.fold("hi")(42)
因为当编译器到达第二个参数列表时,B 已经被推断为String。假设我们不想编写类型注释。我们可以试试把fold改成这样:
def fold[B, B0 >: B](whenTrue: => B)(whenFalse: => B0): B0
但是这个也不起作用,因为B0已经在第一个参数列表的末尾被解析为String,尽管它根本没有出现在其中!简单的解决方案当然是有一个参数列表,但是为了示例,假设我想保留两个参数列表并尝试使其工作......理想情况下,我们应该能够 延迟B0 的分辨率。如果我们能写出这样的东西就好了:
def fold[B](whenTrue: => B)[B0 >: B](whenFalse: => B0): B0
但不幸的是,这不起作用。有什么解决方法吗?
(我提供的是第一个答案,但我当然也在寻找其他解决方法。)
【问题讨论】:
-
这看起来确实是一个可以用
Eitherclass 稍微不同处理的问题,你考虑过这种可能性吗? -
@Nicolas 我看不到使用
Either将如何帮助编译器推断参数whenTrue和whenFalse的最具体的常见超类型,但请随时提出答案,我会非常有兴趣阅读它。
标签: generics scala parameters type-inference