1. 中缀类型的定义
定义:中缀类型不是特殊类型,只是在表达方式上允许使用中缀形式而已
2. 中缀类型的使用
2.1 中缀操作符
2.1.1 形式
中缀操作符是调用方法时省略了"点"和"括号",例如a+b相当于a.+(b),x foo y相当于x.foo(y)
2.1.2 本质
中缀操作符就是方法,需要在类中进行定义
2.1.3 普通中缀操作符:左结合操作符
class A(a:Int){
val num:Int = a
def +(b: A):Int = this.num * b.num
}
val a1 = new A(10)
val a2 = new A(20)
a1.+(a2)
a1 + a2
2.1.4 特殊中缀操作符:右结合操作符,以冒号结尾的操作符调用顺序与普通中缀操作符相反,从右向左
class A(a: String){
val name = a
def +(b: A):String = this.name + b.name
def +:(b: A):String = this.name + b.name
}
val a1 = new A("a1")
val a2 = new A("a2")
a1 + a2 // 左结合操作符,从左向右计算,返回a1a2
a1 +: a2 // 右结合操作符,从右向左计算,返回a2a1
a1 + a2 +: a2 // 左结合操作符、右结合操作符混用,会报错:error: left- and right-associative operators with same precedence may not be mixed
2.2 具有两个类型参数的高阶类型:
2.2.1 形式
带有两个类型参数的高阶类型可以省略"逗号"和"中括号",类名中置,例如Foo[Int, String]相当于Int Foo String
2.2.2 本质
带有两个泛型类型的类
2.2.3 举例
class Foo[Int, String]
val test:Int Foo String = null.asInstanceOf[Int Foo String] // 返回结果为test: Foo[Int,String] = null
2.3 模式匹配中的样例类
2.3.1 形式
- 在模式匹配时,带有两个参数的样例类可以省略"类型信息"、“逗号"和"括号”,将构造函数名中置
- 有样例类case Cons(a: String, b: String)
在模式匹配时:
case “one” Cons “two” =>
等同于
case Cons(“one”, “two”) =>
2.3.2 本质
带有两个参数的样例类
2.3.3 举例
case class Cons(a: String, b:String)
val cons = Cons("one", "two")
cons match{
case "one" Cons "two" => println("ok") // 值的匹配
case Cons("one", "two") => println("ok") // 值的匹配
case a Cons b => println("ok") // 类型匹配
case (a:String) Cons (b:String) => println("ok") // 类型匹配
// case a:String Cons b:String => println("error") // 语法有错误,报错:error: '=>' expected but identifier found
}