在Scala中,可以使用方差运算符(如+和 - )在泛型类型参数上定义方差。例如List
类型在标准库中是协变的。在Scala中使用协方差符号或泛型边界时
class List[+A]
因此,与协变列表中的函数可以这样定义:
def foo[A](list : List[A])
方差也可以用普通的界限进行仿真。因此,我们也可以这样写
def foo[A](list : List[_:< A])
当然,这是没有意义的,因为list
已经是协变的。但是对于不是协变的类型也可以做同样的技巧。 (如Stack
)。当然,也可以从协议栈的堆栈(聚合的继承)创建新的类型。
所以我的问题:
- 时,应使用通用的界限进行方差?何时应该创建一个新的协变类型?
- 泛型边界仅对方差有用,还是可以声明更多(语言概念)。
- 如果它们只对方差有用,是否仅限于兼容Java?
提前:)
我将这个问题加倍 - 差异是Scala中最难处理的部分,我实际上对它的理解并不理想。 “Blah-blah covariant blah出现在逆变位置blah-blah”:p – Jeriho 2010-09-08 07:55:43
当我观察一些函数特征(函数1,函数2等)的定义时,我理解了变化函数特征都是输出类型的协变并且与输入(参数)类型相反。例如,任何类型为String => Unit的函数都可以使用类型为“Any => Unit”的函数,因为“Any => Unit”函数可以接受一个字符串作为输入(因为它可以以任何东西为输入。)这就是为什么方法参数的类型是“逆变位置”。 – 2010-09-08 12:18:02