Java中的转换变量

Java中的转换变量

我想知道有没有人能告诉我演员是怎么工作的?我明白什么时候我应该这么做,但实际上不是这样的。对于原始数据类型,我部分理解,但是当谈到转换对象时,我不理解它是如何工作的。

一个有类型对象的对象怎么会突然被抛到,比如说,MyType(只是一个例子)然后得到所有的方法?


Helenr
浏览 329回答 3
3回答

慕田峪9158850

Java中的转换不是魔术,而是告诉编译器A类型的对象实际上是更具体的B类型,从而访问B上的所有方法,否则就没有了。在执行强制转换时,您没有执行任何魔术或转换,您实际上是在告诉编译器“相信我,我知道我在做什么,我可以向您保证,此行中的这个对象实际上是一个<INSERT CAST type Here”。例如:Object&nbsp;o&nbsp;=&nbsp;"str";String&nbsp;str&nbsp;=&nbsp;(String)o;上面的一切都很好,不是魔法,一切都很好。存储在o中的对象实际上是一个字符串,因此我们可以在没有任何问题的情况下转换为字符串。有两种可能会出错的方法。首先,如果您在完全不同的继承层次结构中转换两种类型,那么编译器就会知道您很傻,并阻止了您:String&nbsp;o&nbsp;=&nbsp;"str";Integer&nbsp;str&nbsp;=&nbsp;(Integer)o;&nbsp;//Compilation&nbsp;fails&nbsp;here第二,如果它们在相同的层次结构中,但仍然是无效的强制转换,则ClassCastException将在运行时抛出:Number&nbsp;o&nbsp;=&nbsp;new&nbsp;Integer(5);Double&nbsp;n&nbsp;=&nbsp;(Double)o;&nbsp;//ClassCastException&nbsp;thrown&nbsp;here这实际上意味着您违背了编译器的信任。您已经告诉它,您可以保证对象是特定类型的,而它不是。你为什么需要演员?首先,您只需要在从更一般的类型到更特定的类型时才需要它。例如,Integer继承自Number,所以如果您想存储一个Integer作为Number那就可以了(因为所有的整数都是数字)。然而,如果你想反过来,你需要一个转换-不是所有的数字都是整数(以及我们的整数)。Double,&nbsp;Float,&nbsp;Byte,&nbsp;Long等等)而且,即使您的项目或JDK中只有一个子类,也可以很容易地创建另一个子类并分发它,所以即使您认为这是一个简单的、显而易见的选择,也无法保证!关于转换的使用,您仍然可以在一些库中看到对它的需求。PreJava-5在集合和各种其他类中大量使用,因为所有集合都在添加对象,然后转换出返回集合的结果。然而,随着泛型的出现,许多用于转换的用途已经消失-它已经被泛型所取代,它提供了一种安全得多的替代方案,没有ClassCastExceptions的潜力(实际上,如果您干净地使用泛型,并且它编译时没有警告,您就可以保证永远不会得到ClassCastException)。

一只斗牛犬

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

哔哔one

假设你想投一个String转到File(是的,这没有任何意义),您不能直接转换它,因为File类不是子类,也不是String类(编译器抱怨)。但你可以投你的String到Object,因为String是Object&nbsp;(Object是父母)。然后,您可以将此对象转换为File,因为文件是Object.因此,从编译时的输入角度来看,您的所有操作都是“合法的”,但这并不意味着它将在运行时工作!File&nbsp;f&nbsp;=&nbsp;(File)(Object)&nbsp;"Stupid&nbsp;cast";即使没有意义,编译器也会允许这样做,但是它会在运行时崩溃,只有这个例外:Exception&nbsp;in&nbsp;thread&nbsp;"main"&nbsp;java.lang.ClassCastException: &nbsp;&nbsp;&nbsp;&nbsp;java.lang.String&nbsp;cannot&nbsp;be&nbsp;cast&nbsp;to&nbsp;java.io.File
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java