2015-12-10 54 views
-1

我刚开始学习Scala,我很困惑与泛型:斯卡拉:通用方法合成

问题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

'什么是X这里看起来像Java的E(此代码工作正常)''什么E'? – pedrofurla

+0

'2'编译得很好。 – pedrofurla

+0

时间参数位置中的下划线表示未知的时间。所以,'List [_]'和'(_)=> Boolean','_'s是未知的,因此不一定是相同的。 – pedrofurla

回答

0

答案1:X是通用类型参数。所以方法getRemainingItem通用方法其将与一具体类型参数(一个型实例X = Int)被调用。

答2:该代码段并编译(使用Scala 2.11测试)

答案3:一个类型T[_]T[X] forSome { type X }的快捷方式(这是一个存在类型)。这与Java 通配符https://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html)类似。当然,说“一些未知类型T”与“Any”(这是一个具体类型 - 最高类型)不同。

欲了解更多信息: - What is an existential type?

+0

谢谢...知道了:) – secret129