<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                [TOC] # 泛型 ~~~ [T <: UpperBound] 上界,定義個上限,不能超過 [T >: LowerBound] 下界,定義下限,不能低于 [T <% ViewBound] 視圖界定,如果你想標記某一個泛型可以隱式的轉換為另一個泛型,可以使用[T <% Comparable[T]],由于scala的Int類型沒有實現Comparable接口,所以我們需要將Int類型隱式的轉換為RichInt類型 [T : ContextBound] 上下文界定 [+T] 斜變,方法返回 [-T] 逆變,方法參數 ~~~ 在java中,T同時是A和B的子類型,稱為多界,形式如: `<T extends A & B>` 在scala中,對上界和下界不能有多個,但是可以使用混合類型,如: `[T <: A with B]` 在java中,不支持下界的多界形式.如: `<T super A & B>`這是不支持的 在scala中,對復合類型依然可以使用下界,如: `[T >: A with B]` # 例子 ## `[T <: UpperBound]` ~~~ package gen class Boy(val name: String, var faceValue: Int) extends Comparable[Boy]{ override def compareTo(o: Boy): Int = { this.faceValue - o.faceValue } } ~~~ ~~~ package gen class MrRight[T <: Comparable[T]] { // 方法也可以加泛型 //def choose[T <: Comparable[T]] (first: T, second: T): T = { def choose(first: T, second: T): T = { if (first.compareTo(second) > 0) first else second } } object MrRight { def main(args: Array[String]): Unit = { val mr = new MrRight[Boy] val b1 = new Boy("xiaowang", 99) val b2 = new Boy("xiaoxia", 77) mr.choose(b1, b2) } } ~~~ ## `[T <% ViewBound]` ~~~ package gen class Girl(val name: String, var faceValue: Int) { } ~~~ ~~~ package gen object MyPreDef { //隱式轉換 implicit def girl2Ordered(g : Girl) = new Ordered[Girl] { //比較規則放這里 override def compare(that: Girl): Int = { g.faceValue - that.faceValue } } } ~~~ ~~~ package gen //viewbound,必須有個隱式轉換的方法 class MissRight[T <% Ordered[T]] { def choose(first: T, second: T): T = { if (first > second) first else second } } object MissRight { def main(args: Array[String]): Unit = { //要在new之前導入,隱式轉換,隱式轉換里面寫比較規則 import MyPreDef.girl2Ordered val mr = new MissRight[Girl] val g1 = new Girl("ab", 90) val g2 = new Girl("mr", -1) val result = mr.choose(g1, g2) println(result.name) } } ~~~ ## `[T : ContextBound]` ~~~ ~~~ # Manifest上下文界定 Manifest是scala2.8引入的一個特質,用于編輯器在運行時也能獲取泛型類型的信息.在jvm上,泛型參數類型T在運行時是被擦拭掉的,編譯器把T當作Object來對待,所以T的具體信息是無法得到的. 為了使在運行時得到T的信息,scala需要額外通過Manifest來存儲T的信息,并作為參數用在方法的運行時上下文 ~~~ def test[T](x:T, m:Manifest[T]) {...} ~~~ 有了Manifest[T]這個記錄T類型信息的參數m,在運行時就可以根據m來更準確的判斷T了,但如果每個方法都這么寫,讓方法的調用者要額外傳入m參數,非常不友好,而且該方法的設計對于scala而言簡直就是一道傷疤.好在scala有隱式轉換,隱式參數的功能,在這個地方可以用隱式參數來減輕調用者的麻煩 ~~~ object Main3 extends App { import scala.reflect.runtime.universe._ def test2[A: TypeTag](x: List[A]) = typeOf[A] match { case t if t =:= typeOf[String] => "String List" case t if t =:= typeOf[Int] => "Int List" } println(test2(List("s1", "s2"))) println(test2(List(1, 2))) } ~~~ # 多界界定 可以同時擁有上界和下界 ~~~ T >: A <: B ~~~ 這種情況下界必須寫在前面,上界寫在后面,位置不能反.同時,A要符合B的子類型,A與B不能是兩個無關的類型 可以同時擁有多個view bounds ~~~ T <% A <% B ~~~ 這種情況要求必須同時存在`T => A`的隱式轉換,和`T => B`的隱式轉換 # 類型約束 類型約束,提供了限定類型的另一種方式,一共有3種聲明 `T =:= U`意思為: T類型是否等于U類型 `T <:< U`意思為: T類型是否為U或U的子類型 `T <%< U`意思為: T類型是否被隱式(視圖)轉換為U 如果想使用上面的約束,需要添加"隱式類型證明參數",比如: ~~~ class Pair5[T](val first: T, val second: T)(implicit ev: T <:< Comparable[T]) { } ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看