隐式转换和泛型
1、隐式转换
object Test01 {
def main( args: Array[ String ] ) : Unit = {
val x: Int = 1.0
println( m1( 30 ) )
println( m1( 30 ) ( 90 ) )
val person = new Person( "fang" , 18 ) . maxPerson( new Person( "yire" , 20 ) )
println( person. name)
}
implicit def doubleToInt( x: Double ) : Int = {
x. toInt
}
implicit val y: Int = 20
def m1( x: Int ) ( implicit y: Int ) = {
x + y
}
implicit class ImplicitClass( x: Person) {
def maxPerson( p: Person) = {
if ( p. age > x. age)
p
else
x
}
}
class Person( var name: String , var age: Int )
}
2、泛型
1.泛型方法和泛型类
object Test02 {
def main( args: Array[ String ] ) : Unit = {
m1( "sss" )
m1( 20 )
m1( List( 1 , 2 , 3 , 4 ) )
println( new Person[ String ] ( "aaaa" ) . name)
println( new Person[ Int ] ( 111 ) . name)
println( new Person[ List[ String ] ] ( List( "a" , "b" , "c" ) ) . name)
}
def m1[ T] ( x: T) = {
println( x)
}
class Person[ T] ( var name: T)
}
2.协变和逆变
object Test03 {
def main( args: Array[ String ] ) : Unit = {
var arr1: List[ A] = List( new A, new A)
var arr2: List[ AA] = List( new AA, new AA)
arr1 = arr2
println( arr1)
var arr3: List[ B[ A] ] = List( new B[ A] , new B[ A] )
var arr4: List[ B[ AA] ] = List( new B[ AA] , new B[ AA] )
arr3 = arr4
println( arr3)
var arr5: List[ C[ A] ] = List( new C[ A] , new C[ A] )
var arr6: List[ C[ AA] ] = List( new C[ AA] , new C[ AA] )
arr6 = arr5
println( arr6)
var arr7: List[ D[ A] ] = List( new D[ A] , new D[ A] )
var arr8: List[ D[ AA] ] = List( new D[ AA] , new D[ AA] )
}
class A
class AA extends A
class B[ + T]
class C[ - T]
class D[ T]
}
3.泛型上下限
object Test04 {
def main( args: Array[ String ] ) : Unit = {
val ba = new B[ A]
val baa = new B[ AA]
val caa = new C[ AA]
val caaa = new C[ AAA]
}
class A
class AA extends A
class AAA extends AA
class AAAA extends AAA
class B[ T > : AA]
class C[ T < : AA]
}
4.上下文限定
object Test05 {
class B[ T]
implicit val x: B[ Int ] = new B[ Int ]
def main( args: Array[ String ] ) : Unit = {
m1( 1 )
m2( 1 )
}
def m1[ A] ( a: A) ( implicit b: B[ A] ) : Unit = {
println( "m1" )
}
def m2[ A: B] ( a: A) : Unit = {
println( "m2" )
}
}