我很困惑java中当前类型和真实类型之间的区别是什么?有没有可以帮助我理解的例子?
编译器使用类型转换来验证我们是否正确使用了类型。 (这称为"当前类型"。) 运行代码时使用true类型。
我有点困惑这是什么意思。
答案 0 :(得分:3)
(以下是故意不严谨的。应该注意的是,您的“当前类型”/“真实类型”术语未在JLS或Java教程中使用。)
以下是一个例子:
Integer i = new Integer(12345);
Object o = i;
Integer i1 = o; // HERE #1
Integer i2 = (Integer) o; // HERE #2
在此代码中,创建了一个对象,其真实类型为Integer
。这永远不会改变。只要它存在,它的真实类型总是为Integer
...
当前类型的概念实际上是关于编译器和运行时系统“知道”值的类型。例如。
他们知道i
将包含对Integer
实例或Integer
某个子类型的引用。
他们知道o
将包含对Object
实例或Object
某个子类型的引用。
即使>>我们<<知道o
中的引用实际上是对Integer
的引用,编译器不允许知道这一点。 JLS这么说!
在标记为HERE #1
的语句中,编译器知道o
的当前类型为Object
且必须分配给i1
,其当前类型为Integer
。这不起作用,因为并非“Object
或子类型”的每个实例都是Integer
。 (例如,String
实例不是。)因此编译器会给你一个编译错误。
在HERE #2
,我们添加了一个类型转换。此类型转换告诉运行时系统测试o
引用的对象的真实类型是Integer
还是子类型。如果是,则编译器和运行时知道将引用分配给i2
是安全的。如果没有,将抛出异常。
答:这是为了使多态性类型安全。允许您编写将Integer
视为Object
但不是String
的代码。
问:但我知道o
实际上包含Integer
。那么为什么不能编译呢?
答:这是一个简单的例子:
编译器没有智能。它们不被允许是智能的......因为这意味着所有Java编译器都需要是智能的(为了便携性),并且智能会使Java编译速度慢很多...... < / p>
对于足够复杂的例子,你将无法知道。
计算机科学理论认为,有些例子表明,如果不对其进行测试,就不可能知道表达式的真实类型。