2
A
回答
3
运行的javap -c这个类:
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
+0
我可以认为这也适用于对象引用? – Acidic 2012-01-06 09:34:25
1
太阳称之为identity conversion.
从链路--quote -
从类型到同样类型A转换允许用于任何类型。
这看起来很平凡,但它有两个实际的结果。首先, 总是允许表达式具有以 开头的期望类型,从而允许简单规定的规则,即每个表达式 都可以进行转换(如果仅进行简单的标识转换)。其次,这意味着为了清晰起见,允许程序包括冗余演员操作员。
相关问题
- 1. C#不能隐式转换类型时类型相同
- 2. 单击不能将类型System.Collections.Generic.Stack隐式转换为相同类型
- 3. 将类型转换为相同的类型,但在不同的程序集中?
- 4. 显式类型转换成int
- 5. C#显式转换派生类型
- 6. 字符串转换为相同格式
- 7. 类型转换为具有相同属性的另一个
- 8. 无法在WCF中转换为相同类型
- 9. 如何将一种类型转换为与包名相同的多种类型?
- 10. 1067:将类型值的隐式强制转换为不相关的类型flash.display:DisplayObject
- 11. 不能隐式转换类型为int
- 12. 类型转换为基类
- 13. 类类型转换:为什么类型转换功能不叫
- 14. 在Swift中为自定义类型定义显式转换
- 15. Java显式类型转换为浮点除法
- 16. 转换为C++中显式的本机类型
- 17. 显式列表转换为错误类型?
- 18. 如何将类型'System.Collections.Generic.List <System.Web.Mvc.SelectListItem>'显式转换为'System.Web.Mvc.SelectList'?
- 19. 在Visual Studio中将“var”转换为显式类型?
- 20. 隐式类型转换?
- 21. 隐式转换泛型类
- 22. 隐式类型转换
- 23. 如何参数类型转换为不同的对象类型
- 24. C#泛型类型转换Decimal转换为Float - “不能转换类型'T1'? 'T2'“
- 25. 无法隐式转换类型双为int,显式转换存在(是否缺少强制转换?)
- 26. Enum.Parse不能隐式地将类型'对象'转换为存在显式转换(你缺少一个转换吗?)
- 27. 将VB转换为C#类型转换
- 28. 显式转换的子类
- 29. 隐式转换IEnumerable转换为泛型
- 30. 将相同的数据转换为不同的格式(模型或控制器)
为什么你需要这样做? – 2012-01-06 09:23:52
@HarryJoy我只是想知道编译器在这种奇怪的情况下的行为,因为它甚至不会产生警告。 – Acidic 2012-01-06 09:26:49
我真的写过对话吗?哈哈!感谢编辑。 – Acidic 2012-01-06 09:30:28