当前位置: 首页 > 知识库问答 >
问题:

为什么这个编译很好(下面是明显的运行时异常)

汪德寿
2023-03-14

我有一个超类动物和两个子类:猫和狗。Dog类有一个专属于它自己的新方法,称为playFetch()。

Animal G = new Cat("Tom");
((Dog) G).playFetch();

在运行时,我们知道会发生什么。请说服我为什么编译器不抱怨。还是我的论点正确?

共有1个答案

毕泽宇
2023-03-14

强制转换总是强制转换,正确使用它取决于程序员。也许您是为了单元测试而试图生成ClassCastException(“猫永远不应该扩展狗”),或者有编译器无法理解的其他计划。因此,当您使用告诉编译器后退的特性时,编译器后退,强制转换就是这些特性之一。

(这也解释了为什么规范允许编译器这样做。)

 类似资料:
  • 然而,在我下面的代码中,我希望在这两个示例中都花费相同的15秒(每个任务5秒),如本文所述。然而,第二个示例只需要5秒,同时运行所有3个示例也需要5秒来完成第二个示例。原来的文章花了5秒,但我把它改成了1秒的延迟,让它更明显。 有没有人能解释一下这是怎么回事,为什么它看起来像线程一样运行?

  • 我在一个类中有一个方法,该方法具有使用泛型指定的返回类型。 对于通用返回类型,我假设上面示例中的返回将评估为: 相反,被正确返回和打印。 如果我将调用更改为: 我错过了什么,以帮助我理解这里发生了什么,为什么原始版本没有导致编译错误。

  • 我在这里读到了关于C默认初始化的内容。它说: 如果T是const限定类型,则它必须是具有用户提供的默认构造函数的类类型。 该链接上给出的示例是(我只显示了与我的问题相关的程序语句,其他我省略了): 但它在gcc 4.8.1上编译良好 因此,我认为成功编译上述程序的原因是结构T1中没有成员。因此,在这种情况下不会发生默认初始化。但如果我添加一个数据成员,如: 然后编译器给出适当的错误消息,如下所示:

  • 此代码可编译但不运行;当我试图运行这个程序时,它会给出一个。我做错了什么?

  • 问题内容: 我在类中有一个方法,该方法具有通过使用泛型指定的返回类型。 对于通用返回类型,我假设以上示例中的返回将计算为: 而是返回a并正确打印。 如果将调用更改为:我收到编译错误: 我缺少什么来帮助我了解这里发生了什么以及为什么原始版本没有导致编译错误。 问题答案: 这是因为重载解析解决了您的调用,因为没有。 请记住,Java的泛型会在运行时删除。像这样的演员阵容将被删除,并移至呼叫站点。有时这

  • 问题内容: 如果你给 它没有编译,但是带有花括号的相同代码是: 有什么解释? 问题答案: 基本上,变量声明只能在块中声明。 查看 Java语言规范中“语句”的语法 -它包括Block,但不包括LocalVariableDeclarationStatement- 后者是block语法的一部分。 这实际上是实用主义的问题:如果没有括号,则只能使用一个语句。如果没有后续语句,则声明变量是没有意义的,因为