我想实现一个类C来存储各种数值类型的值,以及布尔值.此外,我想能够在这个类的实例操作,类型之间,转换在必要Int --> Double和Boolean -> Int,即,能够添加Boolean + Boolean,Int + Boolean,Boolean + Int,Int + Double,Double + Double等等,返回最小的可能类型(Int或Double可能的),只要.
到目前为止,我想出了这个:
abstract class SemiGroup[A] { def add(x:A, y:A):A }
class C[A] (val n:A) (implicit val s:SemiGroup[A]) {
def +[T <% A](that:C[T]) = s.add(this.n, that.n)
}
object Test extends Application {
implicit object IntSemiGroup extends SemiGroup[Int] {
def add(x: Int, y: Int):Int = x + y …Run Code Online (Sandbox Code Playgroud) 我一直认为在scala中不可能进行多级隐式转换(除非你定义视图边界:http://docs.scala-lang.org/tutorials/FAQ/context-and-view-bounds.html)
但似乎类型系统存在缺陷或不一致.以下示例(改编自如何在Scala中链接implicits?)
class A(val n: Double){
def total = n + 10
}
object T1{
implicit def toA(n: Double): A = new A(n)
val i : Int = 5
println(i.total) //Why does this work?
println(5.2.total)
}
Run Code Online (Sandbox Code Playgroud)
我真的不明白为什么Int - > Double - > A的隐式转换有效.有人可以解释原因吗?谢谢
为什么以下编译?
scala> val ch1 = 'a' + 'b'
ch1: Int = 195
Run Code Online (Sandbox Code Playgroud)
但以下不是?
scala> var ch1 = 'a'
ch1: Char = a
scala> ch1 += 'b'
<console>:9: error: type mismatch;
found : Int
required: Char
ch1 += 'b'
^
scala> ch1 = ch1 + 'b'
<console>:8: error: type mismatch;
found : Int
required: Char
ch1 = ch1 + 'b'
^
Run Code Online (Sandbox Code Playgroud)
为什么错误信息如此误导?为什么它说required: Char我什么时候通过显然是一个Char?