[英]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.