隐式转换在Scala中如何工作?

时间:2014-10-01 00:26:03

标签: scala

给出以下类型定义:

type Set = Int => Boolean

我可以声明一个返回Set两种方式的函数

def singletonSet(elem: Int): Set = 
  value => value == elem

def singletonSet(elem: Int): Set =
  Set(elem)

第二个定义使用Scala标准库中的Set而不是声明的类型,但Scala如何隐式转换为声明的类型Set?隐式转换对我来说似乎很奇怪。

为了澄清第二个定义,我在以下有效代码中更改了该类型的名称:

type SetX = Int => Boolean

def singletonSet(elem: Int): SetX =
    Set(elem)

2 个答案:

答案 0 :(得分:7)

Set[A] extends A => Boolean,因此没有隐式转换,只是子类型。

答案 1 :(得分:0)

Set具有应用函数A =>布尔值,对于每个A,如果它存在于Set中则返回true;如果不存在则返回false(它调用' contains'函数)。例如:

val sx = Set(1,2,3)
sx(1) // true
sx(5) // false
在singletonSet中使用一个元素创建一个Set [Int]并返回" apply"功能。
实际上,singletonSet可以定义为:

def singletonSet(elem: Int) = Set(elem).contains _