簡體   English   中英

從接口轉換與從父類轉換

[英]Casting from interface vs from parent class

鑒於班級

public class Dog extends Animal implements Friend{

  ...
}

以下哪一項在性能方面更昂貴?

Dog myDog = (Dog) someAnimal;//where Animal someAnimal

或者

Dog myDog = (Dog) someFriend;//where Friend someFriend

我知道這個問題可能需要一些專業知識才能回答,所以感謝您的幫助。 請提供一些有價值的解釋。

如果您查看字節碼,兩者都不會更昂貴。 我會擔心構造和拋出ClassCastExceptions的巨大開銷,如果轉換失敗,這在任何一種情況下都會發生。 無論如何, instanceof也不會特別傷害您,並且如果無法進行強制轉換,您可以減少性能損失。

這是將聲明為CharSequence (一個接口)的變量轉換為 String:

  public static void main(java.lang.String...);
    Code:
       0: ldc           #2                  // String a
       2: astore_1
       3: getstatic     #3                  // Field java/lang/System.out:Ljava/io/PrintStream;
       6: aload_1
       7: checkcast     #4                  // class java/lang/String
      10: invokevirtual #5                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
      13: return

並將類轉換為子類:

  public static void main(java.lang.String...);
    Code:
       0: new           #2                  // class A$B
       3: dup
       4: invokespecial #3                  // Method A$B."<init>":()V
       7: astore_1
       8: getstatic     #4                  // Field java/lang/System.out:Ljava/io/PrintStream;
      11: aload_1
      12: checkcast     #2                  // class A$B
      15: invokevirtual #5                  // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
      18: return
}

無論如何,這是instanceof的影響:

  public static void main(java.lang.String...);
    Code:
       0: new           #2                  // class A$B
       3: dup
       4: invokespecial #3                  // Method A$B."<init>":()V
       7: astore_1
       8: aload_1
       9: instanceof    #2                  // class A$B
      12: ifeq          25
      15: getstatic     #4                  // Field java/lang/System.out:Ljava/io/PrintStream;
      18: aload_1
      19: checkcast     #2                  // class A$B
      22: invokevirtual #5                  // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
      25: return

如您所見,它只是一個額外的字節碼操作(通常只會檢查對象實例的幾個元素,因為它存在於內存中)和一個 if 語句分支。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM