以另一种方式制定,对于Java赋值“x = y”,Java编译器是否要求x的声明类型是y的超类型(包括相同类型)?
你可以举一个JAVA的例子,x = y,这样声明的“x”类型不是“y”的超类型吗?
回想一下,如果x被声明为“T x”,则声明的类型为“T”。 (超类型按惯例包括“相同类型”。)
谢谢。
[编辑]
以另一种方式制定,对于Java赋值“x = y”,Java编译器是否要求x的声明类型是y的超类型(包括相同类型)?
你可以举一个JAVA的例子,x = y,这样声明的“x”类型不是“y”的超类型吗?
回想一下,如果x被声明为“T x”,则声明的类型为“T”。 (超类型按惯例包括“相同类型”。)
谢谢。
[编辑]
在转让的LHS必须是类型或RHS或一个超级类型。 超类型也协变数组类型是指:字符串[]到对象[](永远不会使用!)。 或加宽(原始类型)可能发生:将int
分配给float
。 或拳击可能会发生:整数到int,int到整数。
那么,取决于你的意思是“超类型”。但是,如果作为一般OOP术语: Object[] arr = new Integer[5];
对于讨论为什么是这样的类型系统的漏洞,请参阅例如http://c2.com/cgi/wiki?JavaArraysBreakTypeSafety
根据下面的Java语言规范,答案是否定的。请参阅黑体文字。
编译时引用类型S(源)到编译时引用类型T(目标)的一个 变量的值被检查作为 的分配如下:
如果S是一个类类型:
- 如果T是一个类类型,则S必须是相同的类为T或S必须是T的子类,或编译时会出现误差。
- 如果T是接口类型,那么S必须实现接口T,否则会发生编译时错误。
- 如果T是一个数组类型,则会发生编译时错误。
如果S是一个接口类型:
- 如果T是一个类类型,则T必须是对象,或发生 编译时间错误。
- 如果T是一个接口类型,那么T必须是 或者S的接口相同或S的超级接口,或者发生编译时错误。
- 如果T是一个数组类型,则会发生编译时 错误。
如果S是一个数组类型SC [],也就是说,类型SC的 分量的数组:
- 如果T是一个类类型,则T必须是对象,或 一个发生编译时错误。
- 如果T是一个接口类型,那么将发生编译时错误,除非T是java.io.Serializable类型或 类型Cloneable(由数组实现的唯一接口)。
如果T是 数组类型TC [],也就是说,类型TC的组件的阵列,则除非执行以下操作之一是真,就会出现一个 编译时错误:
- TC和 SC是相同的原始类型。
- TC和SC都是参考类型,并且类型SC可分配给TC,如通过这些可分配性编译时规则的递归应用程序 所确定的。
我可能会误解一些东西。大胆的部分给出了我认为的问题的正面答案? – zell 2012-01-04 12:06:10
这意味着:对于** T x = S y **来说,y的类型必须是x或子类型的类型。换句话说,x的类型必须是y类型的超类型。 – 2012-01-04 12:13:26
PLZ告诉的-1 – zell 2012-01-04 11:37:59
原因是这样的功课? – oers 2012-01-04 11:42:39
说实话,没有。如果你喜欢,也许这是我的方式来制定这样的问题。 – zell 2012-01-04 11:49:02