2016-05-04 2 views
-2

から対インターフェースからのキャスト?クラス <pre><code>public class Dog extends Animal implements Friend{ ... } </code></pre> <p>次の賢明な、より高価なパフォーマンスです</p>考える親クラス

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

または

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

私はこの質問に答えるために、いくつかの専門知識を必要とする可能性を理解し、そのあなたの助けをありがとうございました。貴重な説明をしてください。

+1

実際には経費があります。この質問は、初心者ではなく、専門家のためのものです。http://www.javaworld.com/article/2076555/build-ci-sdlc/java-performance-programming--part-2--the-cost-of-casting。 htmlの –

+0

私はあなたがコストがないと言ったあなたのコメントを削除参照してください。あなたは完全性のためのあなたの下投票を削除する必要があります。 –

+0

あなたは私の答えを見て、それがあなたの質問に答えるか、それとも何か明確にする必要があるかどうか教えてください。私はdownvotesが必ずしも正当化されていないことに同意するが、それらを削除しようとすると、極端な効率で成功する可能性があります。 – hexafraction

答えて

5

バイトコードを見ると、どちらも高価になりません。代わりにClassCastExceptionsを作成して投げるという大規模なオーバーヘッドについては心配します。いずれの場合も、が発生します。キャストが失敗した場合はいずれもです。いずれにしても、instanceofは特にあなたを傷つけることはありません。また、キャストが発生しない場合は、パフォーマンスペナルティが少なくて済むようになります。ここで

はStringに CharSequence(インターフェース)として宣言された変数をキャストします

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 

ご覧のとおり、それは単なるバイトコードの追加操作ですon(通常はメモリ内に存在するオブジェクトインスタンスのいくつかの要素をチェックするだけです)とif文のブランチです。

関連する問題

 関連する問題