我刚刚开始学习scala,我对Generics非常困惑:
问题1:
def getRemainingItem[X](list : List[X], fun : (X) => Boolean) : List[X] = {
list.filterNot(fun)
}
这里的X看起来像是Java的E(这段代码工作正常)
问题2:
def getRemainingItem(list : List[Any], fun : (Any) => Boolean) : List[Any] = {
list.filterNot(fun)
}
为什么不能正常工作。我在想任何人都可以接受任何类型(这不是编译)
问题3:
def getRemainingItem(list : List[_], fun : (_) => Boolean) : List[_] = {
list.filterNot(fun)
}
这又不起作用,“_”和“任何”
之间有什么区别答案 0 :(得分:0)
答案1 :X是泛型类型参数。所以方法getRemainingItem
是泛型方法,它将使用具体类型参数(类型实例化,例如{{1}来调用}})。
回答2 :该代码段确实编译(使用Scala 2.11测试)
回答3 :类型X = Int
是T[_]
的快捷方式(存在类型)。这类似于Java 通配符(https://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html)。当然,说"一些未知的类型T"不同于说"任何" (这是一种具体类型 - 顶级类型)。
了解更多信息: - What is an existential type?