斯卡拉匿名函数genric方差问题(Scala anonymous function genric

2019-11-02 10:55发布

我在路上学习Scala和我有一个很难理解contravariants,协变量,不变性等。从为什么没有例如编译,又名怎么做(合作,禁忌,和IN)方差工作? 我已经学会了怎样的功能可以被认为是另一个函数的亚型。 (真的很有用就知道了!)

下面的代码是什么,我相信是重要棋子解决我的难题。 我已经提取,我认为会增加不必要的复杂性的问题零件。 根据示例我有一个Student对象,将作为一个工厂产生的功能。

功能将在类型或AnyVal(智力,双,龙等)的subtyes,并且返回输出将是相同的输入类型。 为了实现这一目标,学生类发生在一个普通的(A)是AnyVal的亚型。 抽象类是存在的,这样我可以做这样的事情列表[大师[AnyVal](Student.func1)是指这些学生的名单。

的问题是,我不能有行“Val函数:列表[A] => A”我得到错误“协变型在逆变位置发生在类型=>列表[A] =>值函数的”。 我不知道为什么返回类型必须是A的逆变我有点接受基于期函数特征这一事实的名称。

所以,我如何定义我的功能抽象大师班,这样的返回类型为A型逆变? 我发现如何与功能定义定义这样的例子(出高清功能。[B>:A](V:B):列表[B]),但如何将我用匿名函数实现这个? 还记得“A”在主抽象类必须协变的,因为那里将是采取所有AnyVal类型(int,double等)的功能列表

真正体会到了帮助! 让我知道如果我的任何术语是关闭的。 - 斯卡拉学习者

abstract class Master[+A] {
    val function: List[A] => A
}

class Student[A <: AnyVal](val function: List[A] => A) extends Master[A]

object Student {
def func1 =
    new Student((params: List[Int])=>params(0) + params(1))
}

val myFunc = Student.func1
val someList = List[Master[AnyVal]](myFunc)

Answer 1:

这是很难创建一个协变型参数化泛型类或特性。 一旦你添加方差注释,你不能使用类型为任何类方法的参数。 这是因为功能是禁忌变体,其参数和协在他们的返回类型。 有一个很好的解释这个公认的答案。

如果你真的想要的类型是协变的,你写的所有方法采取型[B>:A]的参数 - 也就是说,采取的超类型作为其参数类型。 这是相当有难度; 在线斯卡拉文档有一个例子可能需要的杂技。



文章来源: Scala anonymous function genric variance issues