【问题标题】:For Java assignment "x=y", does a Java compiler requires that x's declared type is the supertype of y's (including the same type)?对于 Java 赋值“x=y”,Java 编译器是否要求 x 的声明类型是 y 的超类型(包括相同的类型)?
【发布时间】:2012-01-04 11:29:24
【问题描述】:

换一种说法,

你能否给出一个 JAVA 赋值示例,x=y,这样声明的“x”类型不是“y”的超类型?

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

谢谢。

[编辑]

【问题讨论】:

  • 请告诉-1的原因
  • 老实说,没有。如果你愿意,也许这是我提出这样的问题的方式。

标签: java types casting superclass


【解决方案1】:

根据下面的 Java 语言规范,答案是否定的。请参阅粗体文本。

将编译时引用类型 S(源)的值分配给 编译时引用类型 T(目标)的变量被检查为 如下:

如果 S 是类类型:

  • 如果 T 是类类型,则 S 必须与 T 属于同一类,或者 S 必须是 T 的子类,否则会发生编译时错误。
  • 如果 T 是接口类型,则 S 必须实现接口 T,否则会发生编译时错误。
  • 如果 T 是数组类型,则会发生编译时错误。

如果 S 是接口类型:

  • 如果 T 是类类型,则 T 必须是 Object,或者 发生编译时错误。
  • 如果 T 是接口类型,则 T 必须是 与 S 相同的接口或 S 的超接口,或 发生编译时错误。
  • 如果 T 是数组类型,则编译时 发生错误。

如果S是一个数组类型SC[],也就是一个数组 SC 类型的组件:

  • 如果 T 是类类型,则 T 必须是 Object,或者 发生编译时错误。
  • 如果 T 是接口类型,则 除非 T 是 java.io.Serializable 类型或 Cloneable 类型,唯一由数组实现的接口。
  • 如果 T 是 数组类型 TC[],即 TC 类型的组件数组,然后是 除非满足以下条件之一,否则会发生编译时错误:

    • TC 和 SC 是相同的原始类型。
    • TC 和 SC 都是引用类型,并且 类型 SC 可分配给 TC,由递归应用程序确定 这些可分配性的编译时规则。

【讨论】:

  • 我可能会误解一些东西。粗体部分对我认为的问题给出了肯定的答案?
  • 意思是:T x = S y要起作用,y的类型必须是x的类型或者子类型。或者,换句话说,x 的类型必须是 y 类型的超类型。
【解决方案2】:

在分配中,LHS 必须是类型或 RHS 或 super 类型。 对于超类型,协变数组类型也意味着:String[] 到 Object[](永远不要使用它!)。 或者可能发生加宽(原始类型):将int 分配给float。 或者可能发生装箱:Integer to int,int to Integer。

【讨论】:

    【解决方案3】:

    嗯,取决于您所说的“超类型”是什么意思。但是,如果用作通用 OOP 术语: Object[] arr = new Integer[5];

    关于为什么这是类型系统的缺陷的讨论,请参阅例如http://c2.com/cgi/wiki?JavaArraysBreakTypeSafety

    【讨论】:

      【解决方案4】:

      当然:

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

      在这个例子中,o2 的类型不是 o 类型的正确超类型。但是,就问题的意图(可能)而言,请参阅已接受的答案。

      【讨论】:

      • 对不起,按照约定,超类型包含“相同类型”。
      • 对不起,你没有在你的问题中提到你是否指的是正确的超类型。
      猜你喜欢
      • 2010-12-21
      • 2022-10-30
      • 1970-01-01
      • 1970-01-01
      • 2021-03-20
      • 1970-01-01
      • 2021-11-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多