我在路上学习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)