明示的な変換は、同じタイプのパフォーマンスに影響しますか、コンパイラによってフィルタリングされ、バイトコードに到達しませんか?同じタイプへの明示的変換
例:
int x = 3;
int y = (int) x;
明示的な変換は、同じタイプのパフォーマンスに影響しますか、コンパイラによってフィルタリングされ、バイトコードに到達しませんか?同じタイプへの明示的変換
例:
int x = 3;
int y = (int) x;
:
public class SameTypeCastsDemo {
public static void withoutCasts() {
int x = 2;
int y = x;
System.out.println(y);
}
public static void withCast() {
int x = 2;
int y = (int) x;
System.out.println(y);
}
}
をバイトコードが同じに見えることを示しています
public static void withoutCasts();
Code:
0: iconst_2
1: istore_0
2: iload_0
3: istore_1
4: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
7: iload_1
8: invokevirtual #3; //Method java/io/PrintStream.println:(I)V
11: return
public static void withCast();
Code:
0: iconst_2
1: istore_0
2: iload_0
3: istore_1
4: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
7: iload_1
8: invokevirtual #3; //Method java/io/PrintStream.println:(I)V
11: return
更新:非プリミティブオブジェクト参照を持つ:
public class SameTypeCastsDemo {
Integer x;
Integer y;
public SameTypeCastsDemo(Integer x, Integer y) {
this.x = x;
this.y = y;
}
public void print() {
System.out.println(y);
}
public static void withoutCasts() {
SameTypeCastsDemo x = new SameTypeCastsDemo(2, 3);
SameTypeCastsDemo y = x;
y.print();
}
public static void withCast() {
SameTypeCastsDemo x = new SameTypeCastsDemo(2, 3);
SameTypeCastsDemo y = (SameTypeCastsDemo) x;
y.print();
}
}
javap -c SameTypeCastsDemo:
public static void withoutCasts();
Code:
0: new #6; //class SameTypeCastsDemo
3: dup
4: iconst_2
5: invokestatic #7; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
8: iconst_3
9: invokestatic #7; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
12: invokespecial #8; //Method "<init>":(Ljava/lang/Integer;Ljava/lang/Integer;)V
15: astore_0
16: aload_0
17: astore_1
18: aload_1
19: invokevirtual #9; //Method print:()V
22: return
public static void withCast();
Code:
0: new #6; //class SameTypeCastsDemo
3: dup
4: iconst_2
5: invokestatic #7; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
8: iconst_3
9: invokestatic #7; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
12: invokespecial #8; //Method "<init>":(Ljava/lang/Integer;Ljava/lang/Integer;)V
15: astore_0
16: aload_0
17: astore_1
18: aload_1
19: invokevirtual #9; //Method print:()V
22: return
これはオブジェクト参照にも当てはまると思いますか? – Acidic
太陽リンクからidentity conversion.
--quoteそれを呼び出し - その同じ型の型からの変換は、任意のタイプのために許可されている
。
これは些細かもしれませんが、実際には2つの結果があります。まず、 式は、 で始まる所望の型を常に持つことができます。したがって、すべての式 は、単純な識別変換であれば、すべての式が変換の対象になるという単純なルールが可能です。 第2に、明確にするために、プログラムに の冗長キャスト演算子を含めることが許可されていることを意味します。このクラスでてjavap -cを実行している
なぜこれを行う必要がありますか? –
@HarryJoy私は、警告を生成しないので、このような奇妙な状況でのコンパイラの動作については不思議です。 – Acidic
私は本当に会話をしましたか?ハハ!編集していただきありがとうございます。 – Acidic