为了账号安全,请及时绑定邮箱和手机立即绑定

Java中的转换变量

Java中的转换变量

Helenr 2019-06-16 13:43:51
Java中的转换变量我想知道有没有人能告诉我演员是怎么工作的?我明白什么时候我应该这么做,但实际上不是这样的。对于原始数据类型,我部分理解,但是当谈到转换对象时,我不理解它是如何工作的。一个有类型对象的对象怎么会突然被抛到,比如说,MyType(只是一个例子)然后得到所有的方法?
查看完整描述

3 回答

?
慕田峪9158850

TA贡献1794条经验 获得超7个赞

Java中的转换不是魔术,而是告诉编译器A类型的对象实际上是更具体的B类型,从而访问B上的所有方法,否则就没有了。在执行强制转换时,您没有执行任何魔术或转换,您实际上是在告诉编译器“相信我,我知道我在做什么,我可以向您保证,此行中的这个对象实际上是一个<INSERT CAST type Here”。例如:

Object o = "str";String str = (String)o;

上面的一切都很好,不是魔法,一切都很好。存储在o中的对象实际上是一个字符串,因此我们可以在没有任何问题的情况下转换为字符串。

有两种可能会出错的方法。首先,如果您在完全不同的继承层次结构中转换两种类型,那么编译器就会知道您很傻,并阻止了您:

String o = "str";Integer str = (Integer)o; //Compilation fails here

第二,如果它们在相同的层次结构中,但仍然是无效的强制转换,则ClassCastException将在运行时抛出:

Number o = new Integer(5);Double n = (Double)o; //ClassCastException thrown here

这实际上意味着您违背了编译器的信任。您已经告诉它,您可以保证对象是特定类型的,而它不是。

你为什么需要演员?首先,您只需要在从更一般的类型到更特定的类型时才需要它。例如,Integer继承自Number,所以如果您想存储一个Integer作为Number那就可以了(因为所有的整数都是数字)。然而,如果你想反过来,你需要一个转换-不是所有的数字都是整数(以及我们的整数)。DoubleFloatByteLong等等)而且,即使您的项目或JDK中只有一个子类,也可以很容易地创建另一个子类并分发它,所以即使您认为这是一个简单的、显而易见的选择,也无法保证!

关于转换的使用,您仍然可以在一些库中看到对它的需求。PreJava-5在集合和各种其他类中大量使用,因为所有集合都在添加对象,然后转换出返回集合的结果。然而,随着泛型的出现,许多用于转换的用途已经消失-它已经被泛型所取代,它提供了一种安全得多的替代方案,没有ClassCastExceptions的潜力(实际上,如果您干净地使用泛型,并且它编译时没有警告,您就可以保证永远不会得到ClassCastException)。


查看完整回答
反对 回复 2019-06-16
?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

实际上,演员并不总是有效的。如果对象不是instanceof你要把它扔给你的那个班会得到一个ClassCastException在运行时。


查看完整回答
反对 回复 2019-06-16
?
哔哔one

TA贡献1854条经验 获得超8个赞

假设你想投一个String转到File(是的,这没有任何意义),您不能直接转换它,因为File类不是子类,也不是String类(编译器抱怨)。

但你可以投你的StringObject,因为StringObject (Object是父母)。然后,您可以将此对象转换为File,因为文件是Object.

因此,从编译时的输入角度来看,您的所有操作都是“合法的”,但这并不意味着它将在运行时工作!

File f = (File)(Object) "Stupid cast";

即使没有意义,编译器也会允许这样做,但是它会在运行时崩溃,只有这个例外:

Exception in thread "main" java.lang.ClassCastException:
    java.lang.String cannot be cast to java.io.File


查看完整回答
反对 回复 2019-06-16
  • 3 回答
  • 0 关注
  • 327 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信