2012-01-04 37 views
0

以另一种方式制定,对于Java赋值“x = y”,Java编译器是否要求x的声明类型是y的超类型(包括相同类型)?

你可以举一个JAVA的例子,x = y,这样声明的“x”类型不是“y”的超类型吗?

回想一下,如果x被声明为“T x”,则声明的类型为“T”。 (超类型按惯例包括“相同类型”。)

谢谢。

[编辑]

+0

PLZ告诉的-1 – zell 2012-01-04 11:37:59

+0

原因是这样的功课? – oers 2012-01-04 11:42:39

+0

说实话,没有。如果你喜欢,也许这是我的方式来制定这样的问题。 – zell 2012-01-04 11:49:02

回答

1

在转让的LHS必须是类型或RHS或一个超级类型。 超类型也协变数组类型是指:字符串[]到对象[](永远不会使用!)。 或加宽(原始类型)可能发生:将int分配给float。 或拳击可能会发生:整数到int,int到整数。

-1

当然:

Object o = new Object(); 
Object o2 = o; 

在这个例子中,O 2的类型不是0的类型的适当超类型。但是,就问题的意图(可能)而言,请参阅接受的答案。

+1

对不起,超类型按惯例包括“相同类型”。 – zell 2012-01-04 11:51:21

+0

对不起,你没有提到你的问题,你是否指的是正确的超类型。 – afrischke 2012-01-04 12:14:16

2

根据下面的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,如通过这些可分配性编译时规则的递归应用程序 所确定的。
+0

我可能会误解一些东西。大胆的部分给出了我认为的问题的正面答案? – zell 2012-01-04 12:06:10

+0

这意味着:对于** T x = S y **来说,y的类型必须是x或子类型的类型。换句话说,x的类型必须是y类型的超类型。 – 2012-01-04 12:13:26

相关问题