<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      kotlin更多語言結構——>反射

      類引用

        最基本的反射功能是獲取 Kotlin 類的運行時引用。要獲取對靜態已知的 Kotlin 類的引用,可以使用 類字面值 語法

      val c = MyClass::class
      

        請注意,Kotlin 類引用與 Java 類引用不同。要獲得 Java 類引用,請在 KClass 實例上使用 .java 屬性

       

      綁定的類引用(自 1.1 起)

        通過使用對象作為接收者,可以用相同的 ::class 語法獲取指定對象的類的引用

       val widget: Widget = ......
      assert(widget is GoodWidget) { "Bad widget: ${widget::class.qualifiedName}" }
      

        你可以獲取對象的精確類的引用,例如 GoodWidget 或 BadWidget,盡管接收者表達式的類型是 Widget

       

      可調用引用

      函數屬性以及構造函數的引用,除了作為自省程序結構外, 還可以用于調用或者用作函數類型的實例 。

      所有可調用引用的公共超類型是 KCallable<out R>,其中 R 是返回值類型,對于屬性是屬性類型,對于構造函數是所構造類型

       

      函數引用

        當我們有一個具名函數聲明如下

      fun isOdd(x: Int) = x % 2 != 0
      

        我們可以很容易地直接調用它( isOdd(5) ),但是我們也可以將其作為一個函數類型的值,例如將其傳給另一個函數。為此,我們使用 :: 操作符

      val numbers = listOf(1, 2, 3) 
      println(numbers.filter(::isOdd))
      

        函數引用屬于 KFunction<out R> 的子類型之一,取決于參數個數,例如 KFunction3<T1, T2, T3,R> 。

        當上下文中已知函數期望的類型時,:: 可以用于重載函數。例如

      fun isOdd(x: Int) = x % 2 != 0
      fun isOdd(s: String) = s == "brillig" || s == "slithy" || s == "tove"
      
      val numbers = listOf(1, 2, 3) 
      println(numbers.filter(::isOdd)) // 引用到 isOdd(x: Int)
      

        或者,你可以通過將方法引用存儲在具有顯式指定類型的變量中來提供必要的上下文

      val predicate: (String) -> Boolean = ::isOdd // 引用到 isOdd(x: String)
      

        如果我們需要使用類的成員函數或擴展函數,它需要是限定的,例如 String::toCharArray 。

        請注意,即使以擴展函數的引用初始化一個變量,其推斷出的函數類型也會沒有接收者(它會有一個接受接收者 對象的額外參數)。如需改為帶有接收者的函數類型,請明確指定其類型

      val isEmptyStringList: List<String>.() -> Boolean = List<String>::isEmpty
      

        

      示例:函數組合

        考慮以下函數

      fun <A, B, C> compose(f: (B) -> C, g: (A) -> B): (A) -> C {
          return { x -> f(g(x)) }
      }
      

        它返回一個傳給它的兩個函數的組合:compose(f, g) = f(g(*)) 。現在,你可以將其應用于可調用引用

      fun length(s: String) = s.length
      
      val oddLength = compose(::isOdd, ::length)
      val strings = listOf("a", "ab", "abc") 
      
      println(strings.filter(oddLength))
      

        

      屬性引用

        要把屬性作為 Kotlin中 的一等對象來訪問,我們也可以使用 :: 運算符

      val x = 1
      fun main() {
           println(::x.get())
           println(::x.name)
      }
      

        表達式 ::x 求值為 KProperty<Int> 類型的屬性對象,它允許我們使用 get() 讀取它的值,或者使用 name 屬性來獲取屬性名

       

        對于可變屬性,例如 var y = 1 ,::y 返回 KMutableProperty<Int> 類型的一個值,該類型有一個 set() 方法

      var y = 1
      
      fun main() {
           ::y.set(2)
           println(y)
      }
      

        屬性引用可以用在預期具有單個泛型參數的函數的地方

      val strs = listOf("a", "bc", "def") 
      println(strs.map(String::length))
      

        要訪問屬于類的成員的屬性,我們這樣限定它

      class A(val p: Int)
      val prop = A::p 
      println(prop.get(A(1)))
      

        對于擴展屬性

      val String.lastChar: Char 
          get() = this[length - 1]
      
      fun main() { 
          println(String::lastChar.get("abc"))
      }
      

        

      與 Java 反射的互操作性

        在 JVM 平臺上,標準庫包含反射類的擴展,它提供了與 Java 反射對象之間映射(參? kotlin.reflect.jvm包)。例如,要查找一個用作 Kotlin 屬性 getter 的 幕后字段或 Java方法,可以這樣寫

        

      import kotlin.reflect.jvm.*
      
      class A(val p: Int)
      
      fun main() {
          println(A::p.javaGetter) // 輸出 "public final int A.getP()" 
           println(A::p.javaField) // 輸出 "private final int A.p"
      }
      

        要獲得對應于 Java 類的 Kotlin 類,請使用 .kotlin 擴展屬性

      fun getKClass(o: Any): KClass<Any> = o.javaClass.kotlin
      

        

      構造函數引用

      構造函數可以像方法和屬性那樣引用。他們可以用于期待這樣的函數類型對象的任何地方:它與該構造函數接 受相同參數并且返回相應類型的對象。通過使用 :: 操作符并添加類名來引用構造函數??紤]下面的函數,它 期待一個無參并返回 Foo 類型的函數參數

      class Foo
      
      fun function(factory: () -> Foo) {
           val x: Foo = factory()
      }
      

        使用 ::Foo ,類 Foo 的零參數構造函數,我們可以這樣簡單地調用它

      function(::Foo)
      

        構造函數的可調用引用的類型也是KFunction<out R>的子類型之一,取決于其參數個數

       

      綁定的函數與屬性引用(自 1.1 起)

        你可以引用特定對象的實例方法

      val numberRegex = "\\d+".toRegex()
      println(numberRegex.matches("29"))
      
      val isNumber = numberRegex::matches 
      println(isNumber("29"))
      

        取代直接調用方法 matches 的是我們存儲其引用。這樣的引用會綁定到其接收者上。它可以直接調用(如上 例所示)或者用于任何期待一個函數類型表達式的時候

      val numberRegex = "\\d+".toRegex()
      val strings = listOf("abc", "124", "a70") println(strings.filter(numberRegex::matches))
      

        比較綁定的類型和相應的未綁定類型的引用。綁定的可調用引用有其接收者“附加”到其上,因此接收者的類型 不再是參數

      val isNumber: (CharSequence) -> Boolean = numberRegex::matches 
      val matches: (Regex, CharSequence) -> Boolean = Regex::matches
      

        屬性引用也可以綁定

      val prop = "abc"::length 
      println(prop.get())
      

        自 Kotlin 1.2 起,無需顯式指定 this 作為接收者:this::foo 與 ::foo 是等價的

       

      綁定的構造函數引用

        inner 類的構造函數的綁定的可調用引用可通過提供外部類的實例來獲得

      class Outer {
          inner class Inner
      }
      
      val o = Outer()
      val boundInnerCtor = o::Inner
      

        

       

       

       

       

       

       

       

       

       

      posted @ 2022-01-27 05:39  王世楨  閱讀(133)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 好紧好爽好湿别拔出来视频男男| 亚洲综合色成在线观看| 又大又紧又粉嫩18p少妇| 亚洲精品一区二区动漫| 一个人免费观看WWW在线视频| 亚洲精品一区二区美女| 国产精品久久久久久久久久久久| 国产成人夜色高潮福利app | 无码综合天天久久综合网 | 垦利县| 日韩成av在线免费观看| 性色欲情网站iwww九文堂| 久久精品夜夜夜夜夜久久| 国产亚洲精品久久久久婷婷图片| 精品一卡2卡三卡4卡乱码精品视频| 国产精品自在自线视频| 久久成人 久久鬼色| 日韩中文字幕精品人妻| 内射老阿姨1区2区3区4区| 国内精品亚洲成av人片| 久久国产精品伊人青青草| 暖暖视频日本在线观看| 国内自拍偷拍福利视频看看| 奇米四色7777中文字幕| 国产成人亚洲日韩欧美| 亚洲美女厕所偷拍美女尿尿 | 国产精品视频午夜福利| 色综合久久婷婷88| 视频一本大道香蕉久在线播放| 国产精品午夜av福利| 久热这里只有精品视频3| 亚洲免费成人av一区| 亚洲一区二区精品偷拍| 色综合久久综合香蕉色老大| 人人爽亚洲aⅴ人人爽av人人片| 欧美日韩亚洲国产| 国产香蕉久久精品综合网| 美女黄网站人色视频免费国产| 国产精品午夜福利在线观看| 欧美黑人XXXX性高清版| 黑人大荫道bbwbbb高潮潮喷|