scala中的泛型

1.泛型类
Scala中的泛型类使用[T]来定义,如:

class Pair[T, S](val first: T, val second: S)
object Pair {
    def apply[T, S](f: T, s: S) = new Pair(f, s)
}

在实例化的时候,会根据参数来推断类型

    val pair1 = new Pair(42, "String") //Pair[Int, String]
    val pair2 = new Pair(42, 28) //Pair[Int, Int]

2.泛型函数

    def getMiddle[T](a: Array[T]) = a(a.length / 2)
    getMiddle(Array(1, 2, 3, 4)) //将会调用getMiddle[Int]
    val f = getMiddle[String] _ //这是具体的函数被保存到f

3.类型变量界定
有时候需要对类型变量进行限制。比如让对偶的类型相同,然后在获取其中较小的值.
这时候我们可以使用,上界T <: Comparable[T],表示子类,当然还有表示超类的
R >: T表示R是T的超类

//  泛型上届 <: 下届 >:
    class Pair[T <: Comparable[T]](val first: T, val second: T) {
    //  获取对偶中比较小的值
        def smaller = if (first.compareTo(second) < 0) first else second
    }
    val p = Pair("string", "int")
    println(p.smaller) 

4.视图界定
在上一个Pair类中,不能new一个Pair(4,1),这是因为scala中的Int不是comparable的子类,需要将其隐式转换为RichInt,这就需要使用到视图界定:T <% Comparable[T],
<%关系意味着T可以被隐式转化为 Comparable[T]

//  泛型下届 <: 
    class Pair[T <% Comparable[T]](val first: T, val second: T) {
    //  获取对偶中比较小的值
        def smaller = if (first.compareTo(second) < 0) first else second
    }
    val p = Pair(4, 1)
    println(p.smaller) 

单纯的比较大小而言Ordered比Comparable更好:

//  Ordered特质比Comparable更好,在其基础上提供了关系操作符
    class Pa[T <% Ordered[T]](val first: T, val second: T) {
        //  获取对偶中比较小的值
        def smaller = if (first.compareTo(second) < 0) first else second
//      使用Ordered获取大值
        def bigger = if(first > second) first else second
    }

5.上下文界定
视图界定T<%V要求必须存在一个从T到V的隐式转化。上下文界定的形式为T:M,
其中M是别的泛型。他要求要有一个类型为M[T]的隐式值。例如:

    class Pair[T:Ordering](val first: T, val second: T) {
        //  使用隐式转化将
        def smaller(implicit ord:Ordering[T]) = if (ord.compare(first,second) < 0) first else second
    }
    val pa12 = new Pa1(2,3)
    println(pa12.smaller)

6.Manifest上下文界定
如果要实例化一个泛型数组Array[T]的话,我们需要一个Manifest[T]对象。例如,T是Int,你会希望虚拟机的多一个int[]。在scala中Array只是一个类,编译器不会对他做任何特殊处理。如果需要使用泛型函数构造泛型数组,你就需要传入Manifest对象 。由于他是构造器的隐式参数,你可以使用上下文界定。

def makePair[T:Manifest](first:T,second:T)={
        val r = new Array[T](2)
        r(0) = first
        r(1) = second
        r
    }
val arr = makePair(4, 9)

为何这么复杂?在JVM中,泛型相关的类型会被擦除,只会有一个makePair方法,却要处理所有的类型T。
7.多重界定的写法
上下界同时存在
T >: Lower <: Upper
不可以有多个上下界,但可以要求一个类型带有多个特质
T <: Comparable[T] with Serializable with Cloneable
多个视图界定
T <% Comparable[T] <% String
多个上下文界定
T : Ordering : Manifest

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值