Web 应用程序安全攻击者无时无刻不在准备对你的 Web 应用程序进行攻击,因此提高你的 Web 应用程序的安全性是非常有必要的。幸运的是,来自开放式 Web 应用程序安全项目 (OWASP) 的有心人已经整理了一份包含了已知安全问题和防御方式的全面的清单。这份清单对于具有安全意识的开发者来说是必读的。
上篇的例子def maxListImpParam[T](element:List[T]) (implicit orderer:T => Ordered[T]):T = element match { case List() => throw new IllegalArgumentException("empty list!") case List(x) => x case x::rest => val maxRest=maxListImpParam(rest)(orderer) if(orderer(x) >
隐含参数的另外一个用法是给前面明确定义的参数补充说明一些信息。 我们先给出一个没有使用隐含参数的例子:def maxListUpBound[T <:Ordered[T]](element:List[T]):T = element match { case List() => throw new IllegalArgumentException("empty list!") case List(x) => x case x::rest =>
隐式变换也可以转换调用方法的对象,比如但编译器看到X .method,而类型 X 没有定义 method(包括基类)方法,那么编译器就查找作用域内定义的从 X 到其它对象的类型转换,比如 Y,而类型Y定义了 method 方法,编译器就首先使用隐含类型转换把 X 转换成 Y,然后调用 Y 的 method。
使用隐含转换将变量转换成预期的类型是编译器最先使用 implicit 的地方。这个规则非常简单,当编译器看到类型X而却需要类型Y,它就在当前作用域查找是否定义了从类型X到类型Y的隐式定义。比如,通常情况下,双精度实数不能直接当整数使用,因为会损失精度:scala> val i:Int = 3.5<console>:7: error: type mismatch; found : Double(3.