在Scala中,可以使用泛型运算符(如+和 - )在泛型类型参数上定义方差。例如,List
类型在标准库中是协变的。
class List[+A]
所以带有协变列表的函数可以像这样定义:
def foo[A](list : List[A])
也可以使用通用边界模拟方差。所以我们也可以写这个
def foo[A](list : List[_:< A])
当然这没有意义,因为list
已经是协变的。但是对于不协变的类型也可以采用相同的技巧。 (如Stack
)。当然,也可以从堆栈(聚合的继承)创建一个新的类型,这是协变的。
所以我的问题:
答案 0 :(得分:14)
如果一个类型是自然协变或逆变的,你应该声明它。您的用户会感谢您的支持。由于Java,使用站点方差确实存在。更准确地说,诸如Array[T <: Number]
之类的类型被视为存在类型的简写:
ArrayBuffer[T] forSome { type T <: Number }
存在类型在Scala中具有相当庞大的语法。这有点故意,因为我们不建议你多用它们。你什么时候需要一个存在主义类型?
List<? extends Number>
。List
。 在Java中,原始类型和通配符类型并不完全相同,也不是与存在类型完全相同(即使我们知道它们不是什么,也很难准确地说明它们是什么)。但它们与实践中的存在性非常接近,因此Scala可以将它们映射到这种类型。
答案 1 :(得分:6)