【问题标题】:implicit upcasting and explicit downcasting in javajava中的隐式向上转换和显式向下转换
【发布时间】:2014-04-13 11:35:14
【问题描述】:

当java可以隐式进行向上转换时,为什么它不能隐式进行向下转换?请用一些简单的例子解释一下?

【问题讨论】:

  • 会更好,这里给出一些示例类
  • @KugathasanAbimaran ,我问了一个不针对某些示例的一般性问题

标签: java inheritance downcast upcasting


【解决方案1】:

关键是向上转换总是会成功,所以它是安全的 - 而向下转换可能会失败:

String x = getStringFromSomewhere();
Object y = x; // This will *always* work

但是:

Object x = getObjectFromSomewhere();
String y = (String) x; // This might fail with an exception

因为这是一个“危险”的操作,语言会强制你明确地去做——你基本上是在对编译器说“我现在比你知道的多!”

【讨论】:

  • 如果产生异常怎么办?我们也可以处理异常。
  • @BreakingBenjamin:是的,你可以——但重点是你告诉编译器你意识到它可能会发生。如果您想使用一种无​​需编译时检查就可以让您玩得更快更松的语言,请使用 Python 或 Ruby 等动态语言。
  • 另一点:你告诉编译器这是因为编译器不会说“你不能那样做”。我认为这是强类型语言的一部分。您是在告诉编译器此时不要像通常那样生成错误或警告。我们这些想要强类型语言的人通常不希望禁用默认功能,仅用于那些(希望很少)我们需要强制转换的情况。
  • 另一种看待它的方式;由于派生类始终是超类的特例,因此将您的对象视为超类的成员并不是不正确的。但是如果你有一个超类对象并且你想把它当作一个子类,那么它可能是不正确的,所以编译器会标记它,除非你强制转换。
猜你喜欢
  • 2017-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-18
  • 2019-03-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多