当前类型和真实类型之间的区别是什么?

时间:2014-05-04 00:47:28

标签: java

我很困惑java中当前类型和真实类型之间的区别是什么?有没有可以帮助我理解的例子?

编译器使用类型转换来验证我们是否正确使用了类型。 (这称为"当前类型"。)        运行代码时使用true类型。

我有点困惑这是什么意思。

1 个答案:

答案 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>

  • 对于足够复杂的例子,将无法知道。

  • 计算机科学理论认为,有些例子表明,如果不对其进行测试,就不可能知道表达式的真实类型。