【问题标题】:Does the compiler "know" about the type of a variable prior to a cast?编译器在强制转换之前“知道”变量的类型吗?
【发布时间】:2015-10-23 09:18:22
【问题描述】:

相关:What does casting do at compiler/machine level?

假设我有自定义类型。 A 型是 B 型的子类型。

最初,我的变量类型是类型 A。然后我将其转换为类型 B。

大多数编译器,尤其是 Java 编译器,是否保留了变量曾经属于 A 类这一事实的任何“记忆”?因此,特定于 A 类变量的操作对 B 类变量仍然有效?

// 谢谢大家的cmets。 Is it possible to call subclasses' methods on a superclass object? - 我在这里找到了答案。我不认为我最初提出了正确的问题,但每个人的帮助让我以不同的方式思考这个问题并最终得到了我的答案。

【问题讨论】:

  • 我不明白你的困惑。变量不会因为你转换了它所持有的值而停止存在

标签: java


【解决方案1】:

铸造本质上是说“假装这个变量是这个类型的,只是为了这个调用”。底层变量/对象不会更改,也不会丢失其类型声明。 Java 是一种静态的强类型语言。

【讨论】:

  • 这对对象是正确的,但不适用于原始类型。
  • 转换原始类型会生成一个全新的值,不是吗?无论哪种方式,这都是一个有争议的问题。
  • 嗯...我不认为我问了正确的问题。假设我有自定义类型 A,它是自定义类型 B 的子类。我创建类型 A 的变量 x。然后我将变量 y 分配给 (Type B)x,从而将 y 分配给 x 的向上转换版本。我应该能够使用 x 的特定于类型的方法来操作 y 吗?
  • @the_rj 请创建一些代码来说明您的意思。如果 A 是 B 的子类,则 A 类型的变量可以访问 A 和 B 的方法。但尚不清楚您的 y 变量的原始类型是什么。
【解决方案2】:

您真的应该尝试一下,但是在您发布的情况下,编译器不会捕获它。它会在运行时出错。

但是我相信如果你尝试做这样的事情:

String foo = "Hello";
Integer val = (Integer) foo;

我认为编译器会捕捉到这一点,因为字符串永远不可能是整数

【讨论】:

    【解决方案3】:

    编译器不会在转换后保留信息,它只是假设您知道自己在做什么。然而,对象本身在施法之后没有改变。所有对象都包含对其内部类的引用,可通过Object#getClass() 访问。在转换期间的运行时,虚拟机通过检查类的兼容性来验证转换是否有效,如果它不是有效的转换,则抛出 ClassCastException。

    【讨论】:

      猜你喜欢
      • 2015-04-02
      • 2014-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-20
      • 2017-01-17
      • 1970-01-01
      相关资源
      最近更新 更多