欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

kotlin中擴(kuò)展方法有哪些

這篇文章給大家分享的是有關(guān)kotlin中擴(kuò)展方法有哪些的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

成都創(chuàng)新互聯(lián)專注于成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、網(wǎng)頁設(shè)計(jì)、網(wǎng)站制作、網(wǎng)站開發(fā)。公司秉持“客戶至上,用心服務(wù)”的宗旨,從客戶的利益和觀點(diǎn)出發(fā),讓客戶在網(wǎng)絡(luò)營銷中找到自己的駐足之地。尊重和關(guān)懷每一位客戶,用嚴(yán)謹(jǐn)?shù)膽B(tài)度對待客戶,用專業(yè)的服務(wù)創(chuàng)造價(jià)值,成為客戶值得信賴的朋友,為客戶解除后顧之憂。

Usage

擴(kuò)展函數(shù)是 kotlin 的又一殺手锏功能,能夠在不修改源碼的基礎(chǔ)上,擴(kuò)展某些類的能力,方便開發(fā)。

例如這里演示了給 String 添加一個獲取第一個元素的方法。

fun String.first(): Char {
  if (isEmpty()) {
    throw NoSuchElementException("String is empty")
  }
  return this[0]
}

fun main(args: Array<String>) {
  println("Hello,World".first())
}

這里需要額外注意的地方在于擴(kuò)展函數(shù)的方法體中,是能夠直接訪問擴(kuò)展對象 public 的變量的。例如上面的方法里面,我們也可以這么寫:

fun String.first(): Char {
  if (length < 1) {
    throw NoSuchElementException("String is empty")
  }
  return this[0]
}

通過 this 可以在方法內(nèi),訪問擴(kuò)展對象,這里就是通過 this[0] 拿到第一個字符的。

Under in hood

看上去很厲害哈,但他的原理卻非常簡單。我們要時(shí)刻記住,kotlin JVM 是基于 JVM 開發(fā)的,kotlin 源碼最后會變成字節(jié)碼而后被運(yùn)行。當(dāng)遇到語法上不太懂的地方,直接反編譯字節(jié)碼,或者 Decompile 成 Java 方法,就能洞察里面的玄機(jī)。

我們將上述代碼,Decompile 成 Java 后,就能發(fā)現(xiàn)里面的秘密。

public static final char first(@NotNull String $this$first){
  Intrinsics.checkParameterIsNotNull($this$first, "$this$first");
  if ($this$first.length() < 1) {
   throw (Throwable)(new NoSuchElementException("String is empty"));
  } else {
   return $this$first.charAt(0);
  }
}

原來是生成了一個 public static final 的方法呀,不過這個生成是 kotlin 提供的語法糖,幫我們完成的。看到這個代碼,也解釋了為什么在擴(kuò)展對象方法內(nèi)部,能夠訪問到擴(kuò)展對象的 public 成員。

重載與多態(tài)

擴(kuò)展方法能否被繼承呢,或者重載呢?我們來看看例子

open class Animal
class Dog : Animal()

fun Animal.desc() = "Animal"
fun Dog.desc() = "Dog"

fun main(args: Array<String>) {
  println(Dog().desc())
  var animal: Animal = Dog()
  println(animal.desc())
}

// output:
// Dog
// Animal

如果擴(kuò)展方法能夠被重載,那么兩次都應(yīng)該輸出 Dog,我們還是和前面方法一樣,來看看真相。

@NotNull
public static final String desc(@NotNull Animal $this$desc) {
  Intrinsics.checkParameterIsNotNull($this$desc, "$this$desc");
  return "Animal";
}

@NotNull
public static final String desc(@NotNull Dog $this$desc) {
  Intrinsics.checkParameterIsNotNull($this$desc, "$this$desc");
  return "Dog";
}

可以看到實(shí)際生成了兩個 desc 方法,里面的參數(shù)不動,所以這個方法的調(diào)用,只與擴(kuò)展對象本身有關(guān)系,在編譯時(shí)已經(jīng)確定,不存在多態(tài)。

擴(kuò)展屬性

這是一個很神奇的設(shè)定,kotlin 并不能真的給擴(kuò)展對象添加一個屬性,而只是提供了一個語法糖,什么意思呢?我們具體看看下面這個例子。

var String.first: Char
  get() {
    if (isEmpty()) {
      throw NoSuchElementException(“String is empty”)
    }
    return this[0]
  }
  set(value) {
    println(“set value to $value”)
  }

fun main() {
  “Hello, World”.first = ‘G'
  println(“Hello,World”.first)
}

我們擴(kuò)展了 kotlin 的屬性,添加了一個 first。我們可以分別給這個所謂的 first 屬性,注意是所謂的,添加 get 和 set 方法。然后我們可以通過 = 和 . 來調(diào)用 set 和 get 方法,就像 main 方法中那樣。但實(shí)際上,最后并沒有生成 first 屬性,我們來看看反編譯過后的代碼。

public static final Char getFirst(@NotNull String $this$first) {
  Intrinsics.checkParameterIsNotNull($this$first, "$this$first");
  CharSequence var1 = (CharSequence)$this$first;
  boolean var2 = false;
  if (var1.length() == 0) {
   throw (Throwable)(new NoSuchElementException("String is empty"));
  } else {
   return $this$first.charAt(0);
  }
}

public static final void setFirst(@NotNull String $this$first, char value) {
  Intrinsics.checkParameterIsNotNull($this$first, "$this$first");
  String var2 = "set value to " + value;
  boolean var3 = false;
  System.out.println(var2);
}

感謝各位的閱讀!關(guān)于“kotlin中擴(kuò)展方法有哪些”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

文章標(biāo)題:kotlin中擴(kuò)展方法有哪些
分享路徑:http://www.chinadenli.net/article46/gcijhg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器網(wǎng)站改版標(biāo)簽優(yōu)化服務(wù)器托管網(wǎng)站設(shè)計(jì)公司靜態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化