我想知道是否有人可以告诉我铸造的工作原理?我知道何时应该执行此操作,但并不真正了解它的工作原理。对于原始数据类型,我会部分理解,但是在涉及对象转换时,我不了解其工作方式。
例如,如何突然将类型为Object的对象转换为对象MyType(仅作为示例),然后获取所有方法?
用Java进行转换并不是魔术,而是告诉编译器A类型的Object实际上是更特定的B类型,因此可以访问B本来没有的所有方法。在执行强制转换时,你没有执行任何魔术或转换操作,实际上是在告诉编译器“相信我,我知道我在做什么,并且我可以向你保证此行的此Object实际上是
Object o = "str";
String str = (String)o;
以上很好,不是魔术,一切都很好。存储在o中的对象实际上是一个字符串,因此我们可以将其强制转换为字符串,而不会出现任何问题。
有两种方法可能会出错。首先,如果要在完全不同的继承层次结构中的两种类型之间进行转换,则编译器将知道你是愚蠢的并阻止你:
String o = "str";
Integer str = (Integer)o; //Compilation fails here
其次,如果它们处于相同的层次结构中,但仍然是无效的强制转换,则将ClassCastException在运行时抛出a :
Number o = new Integer(5);
Double n = (Double)o; //ClassCastException thrown here
这实质上意味着你已经违反了编译器的信任。你已经告诉你可以保证对象是特定类型的,但事实并非如此。
为什么需要铸造?好吧,首先,只有在从更通用的类型转换为更具体的类型时才需要它。例如,Integer
继承自Number
,因此,如果你要存储一个Integeras,Number那么就可以了(因为所有的Integers都是Numbers。)但是,如果要沿相反的方向运行,则需要强制转换-并非所有Numbers都是Integers(同样作为整数我们有Double,Float,Byte,Long
等),即使在你的项目或JDK只是一个子类,有人可以很容易地创建另一个和分发,所以,你不能保证,即使你认为这是一个单一的,显而易见的选择!
关于强制转换的使用,你仍然可以在某些库中看到对它的需求。在Java-5之前的版本中,它在集合和各种其他类中大量使用,因为所有集合都在添加对象,然后转换结果以使你退出集合。但是,随着泛型的出现,铸造的许多用途已不复存在-它已被泛型所取代,泛型提供了更安全的替代方法,而没有潜在的ClassCastExceptions
(实际上,如果你干净地使用泛型并且编译时没有警告,你可以保证永远不会收到ClassCastException
。)
给定的是一个旋转的矩形,该矩形内接到另一个矩形中<两个矩形都有自己的坐标系 在该区域中 我对变换矩阵的尝试(setRotate() 如何计算P点相对于外矩形的位置? 提前感谢!
旋转变换rotate() 同画圆弧一样,这里的rotate(deg)传入的参数是弧度,不是角度。同时需要注意的是,这个的旋转是以坐标系的原点(0,0)为圆心进行的顺时针旋转。所以,在使用rotate()之前,通常需要配合使用translate()平移坐标系,确定旋转的圆心。即,旋转变换通常搭配平移变换使用的。 最后一点需要注意的是,Canvas是基于状态的绘制,所以每次旋转都是接着上次旋转的基础上
问题内容: 我对用Java转换对象的含义感到困惑。 说你有… 这是怎么回事 变量类型会更改吗,还是变量内的对象会更改?很迷茫。 问题答案: 看一下这个样本:
问题内容: 我试图使用database / sql将数据库行查询为Go类型,代码片段如下: MySQL: 如您所见,某些字段具有价值,因此我必须将Type 设置为Go的User struct,并将其转换为。 有人有更好的方法吗?还是我必须更改MySQL字段并设置其 问题答案: 首先是简短的答案: sql包中有一些类型,例如sql.NullString(用于表中的可为空的字符串,并猜测Nullint
问题内容: 有谁知道如何使用Java将任何一种视频格式转换为flv,我一直在寻找用于转换视频的Java api,但似乎没有这种方法,但是可能有一种方法可以实现,我的意思是诸如youtube服务之类的功能确实可以转换视频,但是使用Java,我需要一个可以将视频显示为FLv格式但可以任何格式上传的网络应用程序,如果有人做出了类似的事情,请告诉我如何或任何想法, 谢谢。 问题答案: Java中没有人直接
问题内容: 有人可以启发我为什么我没有得到这个片段吗?我对为什么它不能按我预期的那样非常感兴趣。我现在不在乎这是否是不好的设计。 这是Java版本,编译和运行输出: 问题答案: 类型擦除:泛型仅是一种语法功能,编译器将其删除(出于兼容性原因),并 在需要时 用强制转换代替。 在运行时,该方法不知道类型(这就是为什么无法实例化的原因)。的调用实际上是的调用。之所以被转换为,是因为无边界类型的擦除是(