对于Java赋值“x=y”,Java编译器是否要求x声明的类型是y的超类型(包括相同类型)?

问题描述 投票:0回答:4

以另一种方式表述:

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

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

java types casting superclass
4个回答
2
投票

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

将编译时引用类型 S(源)的值赋值给 a 编译时引用类型 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.Serialized 类型,否则会发生编译时错误 Cloneable 类型,唯一由数组实现的接口。
  • 如果T是 一个数组类型 TC[],即一个 TC 类型的组件数组,然后 除非满足以下条件之一,否则会发生编译时错误:

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

1
投票

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

int
分配给
float
。 或者可能会发生装箱:整数到整数,整数到整数。


1
投票

嗯,取决于你所说的“超类型”是什么意思。但是,如果用作通用 OOP 术语:

Object[] arr = new Integer[5];

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


-1
投票

当然:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.