开发者学堂课程【Scala 核心编程 - 进阶:视图界定的介绍应用实例3】学习笔记,与课程紧密连接,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/610/detail/9157
视图界定的介绍应用实例3
视图界定应用案例3
说明:
自已写隐式转换结合视图界定的方式,比较两个 Person 对象的年龄大小。
//
隐式将Student->Ordered[Person2/放在object Mylmplicit中
implicit def person22OrderedPerson2(person: Person2) = new Ordered[Person2]{
override def compare(that: Person2):Int =person.age-that.age
}
val p1 = new Person2("tom", 110)
val p2 =new Person2(iack" 20)
import Mylmplicit.
_
val compareComm3 =new CompareComm2(p1,p2) printin(compareComm3.geatter)
class Person2(val name: String,val age: Int){
override def toString =this.name +"\t" + this.age
class CompareComm3[T<% Ordered[T]
]
(obj1: Tobj2: T){
def geater = if (obj1 > obj2) obj1 else obj2
新建包:
package com.atguigu.chapter18.
viewbounds
object V
iew
BoundsDemo0
3
{
def main(args: Array
[
string]): Unit = {
val p1 = new Person
3
("tom" 10)
val p2 = new Person
3
("jack", 20)
val compareComm3=newCompareComm3(p1p2) println(compareComm3.getter)
//这样执行肯定是要报错的
}
}
class Person
3
(val name: String,val age:Int)
//这里是重写tostring,为了显示方便
override def toString
:
String =this.name +"\t" + this.age}
}
//说明
//1. T<% OrderedT] 表示T是ordered子类型 java.lang.Comparable
//2. 这里调用的compareTo方法是T这个类型的方法
class CompareComm
3
[T<% Ordered[T](obj1:Tobj2:T){
def getter = if (obj1 > obi2) obj1 else obi2
def geatter2 = if (obj1.compareTo(obj2) > 0) obi1 else obj2
}
报错的解决方案:写隐式函数,专门写在一个地方:
package com.atguigu.chapter18.viewbounds
object MyImplicit {
implicit def person3toOrderedPerson3(p3:Person3) = new Ordered[Person3] {
override def compare(that: Person3)= { //是你自己的业务逻辑 p3.age - that.age
}
}
}
只要把 MyImplicit 引进来就可以用了:
点击运行:
不引是运行不了的。
以上就是视图界定的第三个案例。