给一维对象数组分配二维字符串数组

4
我对这段代码感到困惑。
String[][] str=new String[2][3];
Object[] obj=str;

这个编译是没有问题的。因为Object是一个超类,而String是一个子类。

但是下面的代码会产生错误。

class Ex { } 
class Ex1 extends Ex { } 

class ExTest {
  public static void main(String[] args) 
  { 
    Ex1[][] ex1=new Ex1[2][3]; 
    Ex[] ex=ex1; 
  } 
} 

但是这段代码为什么会产生错误?
4个回答

3

它能够编译是因为obj现在将持有两个一维的String[]对象。

以下所有内容都会被编译:

String[][] str = new String[2][3];
Object obj1 = str;
Object[] obj2 = str;
Object[][] obj3 = str;

但是String[] str1 = str;会出错,因为我们正在将二维字符串数组分配给一维字符串数组..但Object有例外,为什么..我仍然感到困惑。 - saravanan
因为Object是最终的超类。String是Object的子类。 - adarshr
类 Ex { } 类 Ex1 扩展自 Ex { } 类 ExTest { public static void main(String[] args) { Ex1[][] ex1=new Ex1[2][3]; Ex[] ex=ex1; } } 但是这段代码会产生错误,为什么? - saravanan

1
所有的数组实例也都是java.lang.Object类的实例。因此,以下所有赋值都是合法的。objArr1数组的元素是一维的String数组。
     Object obj1 = new String[3];
     Object obj2 = new int[3];
     Object obj3 = new String[3][3];
     Object[] objArr1 = new String[3][4];

更新:

class Ex { } 
class Ex1 extends Ex { } 
class ExTest {
 public static void main(String[] args) { 
    Ex1[][] ex1=new Ex1[2][3]; 
    Ex1[][][] exArr=new Ex1[2][3][3]; 
    Object obj = exArr; //valid
    Object objArr[] = ex1; // valid assignment. every array instances are also object
    Object[][] obj2Arr = exArr;  // valid 
    Object[][][] obj3Arr = exArr; //valid
    Obejct[][][][] obj4Arr = exArr; //compiler error. obj4Arr is 4 dimensional, whereas exArr is three..
    Ex[] ex=ex1;  // compiler error
    Ex1[] ex1Arr = ex1 ; // compiler error
  } 
} 

你不能将不同维度的数组赋值给彼此,即使它们的元素类型相同。你可以将任何维度小于或等于被赋值数组维度的对象数组分配给任何维度的数组,因为每个数组实例也是对象实例。


是的,但是 Ex1[] 可以分配给 Ex[],但不能分配给 Ex[][] 或 Ex。 - Gursel Koca
很抱歉一再询问..我认为这反映了超类和子类之间的关系..这适用于Object,但不适用于其他超类.. - saravanan
不,这与超类和子类之间的关系无关。你应该接受这个事实,“每个数组无论有多少维或者元素类型是什么,都是对象”作为公理。我建议你阅读JLS相关部分。http://java.sun.com/docs/books/jls/second_edition/html/arrays.doc.html - Gursel Koca

1

当你意识到Java数组,无论有多少维度,都是... IS-A关系的对象时,这就有意义了。因此,对象数组可以持有几乎任何数组,因为每个数组都是一个对象


0
首先我想强调一下:

Object是所有数组类型的直接超类

无论是单维数组还是多维数组

或者是字符串数组或任何其他派生类型的数组。

I get confused with this code

String[][] str=new String[2][3];
Object[] obj=str;

This compiles fine. because Object is a super class String is a sub class

假设我们有

Object[] objArray = new Object[2];
objArray[0]= // it can hold something which is of type object
            // as we know String[] IS A Object, so I can assign it here like below
String[] strArray = new String[3];
objArray[0] = strArray ;

在这里,我将一个单维度的String数组分配为objArray的元素,因此我们可以说objArray可以容纳2D字符串数组,即String[][]

Object[] objArray = new String[2][];

but the following code produce errors

 class Ex { } 
class Ex1 extends Ex { } 
class ExTest {
 public static void main(String[] args) 
{ Ex1[][] ex1=new Ex1[2][3]; Ex[] ex=ex1; 
} } 

but this code produce error why

这是因为ex[0]可以容纳一个属于Ex的对象。

假设允许Ex[] ex=ex1;

那么ex[0]应该能够容纳Ex1的一维数组。

ex[0] = new Ex1[3];// but this can not be possible as Ex1[] IS A Object NOT Ex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接