如果Object数组是Object,为什么String数组不是String

时间:2016-06-08 07:46:30

标签: java

Object类是Java中每个类的超类。因此,每个类都应该固有Object类的属性或行为。

然后我们可以声明对象数组,如下所示:

Object c = new Object[] {1,2,"22" };

然后来到String时为什么下面的声明是错误的:

String s = new String[]{"s","s"};

6 个答案:

答案 0 :(得分:22)

new String[]{"s","s"}的类型为String[],而不是StringT[]不是T的子类(除非T恰好是Object)。

Object[]Object的子类型,这就是第一个工作的原因。事实上,所有数组类型都是subtype of Object,可能令人惊讶地包括原始数组,如int[],即使int不是Object(*)。

您可以使用更具体的类型编写第一个:

Object[] c = new Object[] {1,2,"22" };

您可以将第二个写为以下任何一个:

String[] s1 = new String[]{"s","s"};
Object[] s2 = new String[]{"s","s"};
Object s3 = new String[]{"s","s"};

顺便说一句,s2表明Java中的数组是协变的。这是有问题的,因为你可以合法地写:

s2[0] = new Object();

在运行时因ArrayStoreException而失败,因为您无法在Object中存储String[]个引用。

这就是为什么喜欢Josh Bloch的作者给出建议“首选列表到数组”的原因之一(参见 Effective Java 2nd Ed 第25项),因为像List这样的Java集合是不协变,所以不要遭遇同样的问题。

(*)只是为了增加混淆,原始数组不是Object[]的子类型,因为原语不是Object的子类型。例如,编写时会出现编译时错误:

Object[] illegal = new int[5];

答案 1 :(得分:3)

有点令人困惑的是,Object[] Object。 (一方面,这就是Java如何实现零长度数组,并允许数组为函数返回值。)

因此,将Object[]实例分配给Object类型的引用是有意义的。

但是,将String[]实例分配给String类型的引用确实有意义。 (但请注意String[] Object。)

所以

  1. Object c = new Object[] {1,2,"22" };有道理
  2. String s = new String[]{"s","s"};没有意义
  3. Object s = new String[]{"s","s"};有道理

答案 2 :(得分:1)

它的基本Java原则,Everything是Object,因此您可以使用Object引用来完成所有内容 Object o = new AnyOtherClass()

您可以使用类的引用作为其子类 List l = new Arraylist()

但String []是ArrayArray不是String

的祖先

答案 3 :(得分:1)

array是对象或原始数据类型集合的集合,而string是一系列字符。如你所知,对象是所有其他类的超级类,这就是你为什么这样做的原因: Object c = new Object[] {1,2,"22" };

String类不是数组类型的超类......所以你不能像下面那样执行..

String s = new String[]{"s","s"};

希望这会对你有所帮助......

答案 4 :(得分:0)

Object c = new Object[] {1,2,"22" };

是有效的,因为Object的数组仍然是Object。您可以在声明级别指定cObject的数组,如下所示:

Object[] c = new Object[] {1,2,"22" };

然而,

String s = new String[]{"s","s"};

无效,因为String的数组不是String。您需要将数组转换为String,如下所示:

String s = String.join(",", new String[]{"s","s"});

或将其存储为数组,如下所示:

String[] s = new String[]{"s","s"};

答案 5 :(得分:0)

首先,数组保存堆中值的引用。

其次,Object类是java中每个其他类的母类。 所以对象数组可以包含任何类型的引用值,但是字符串数组只保存字符串数据类型的引用,并且每个引用都引用单独的字符串(string[0]= "a",string[1]="stackOverFlow"...)

第三,字符串是java中的一系列字符。

所以,sting数组不能是一个字符串,因为它不是指字符序列,而是指位于堆中的字符串类型的对象。