正在初始化构造函数中的数组(Java)

问题描述:

public class A{ 
     public A(int[] a){} 
} 

public class B extends A{ 
     public B(double[] b){ 
      super({b.length}); //ERROR 
     } 
} 

我希望能够编译上面的代码。为了澄清,我有扩展它的类A和B.类A没有空的参数构造函数。如果我没有在第一行的B类构造函数中调用super,它将尝试调用super(),它不存在。但是,我想调用super(int [] a)。我想通过获取给定的double数组的长度并将其作为长度为1的数组来发送它。它不会让我这样做,因为显然你不能像这样声明一个数组,并且如果我要声明它在一个单独的行上,它会首先调用super(),这是行不通的。正在初始化构造函数中的数组(Java)

有什么办法可以像这样在动态声明int []吗?或者是这里唯一的解决方案或者为A创建一个没有参数的构造函数,或者让我自己的函数返回一个int []?

(不要问我为什么要送它像一个数组。)

如果你坚持不问为什么......

您可以制作数组,分配第一个也是唯一的元素并发送它。

public class B extends A{ 
     public B(double[] b){ 
      int[] arr = new int[1]; 
      arr[0] = b.length; 
      super(arr); // broken, super must be first. 
     } 
} 

这意味着您必须拥有单线解决方案。幸运的是,Java提供了一种内联的方式来在编译时将一系列元素放入数组中。

public class B extends A{ 
     public B(double[] b){ 
      super(new int[]{b.length}); // FIXED 
     } 
} 
+0

谢谢,我不知道你可以同时声明和初始化这样的数组。这正是我正在寻找的。 – user828835

+0

然而,你的第一个解决方案仍然不起作用,因为你在构造函数的第一行中缺少对super()的调用,所以它会被自动调用。但由于我缺少构造函数A(),这会导致错误。不过谢谢你。 – user828835

+0

第一个例子不会编译。你需要在第一行调用super/this构造函数。第二次通话+1。 – user802421

叶氏,尝试:

super(new int[]{b.length}); //ERROR NO MORE 
+0

不,只会使数组等于将b.length的长度。我想要的长度是1,并且第一个(也是唯一的)条目的值是b.length。 – user828835

+0

@ user828835固定 – OscarRyz

你也可以

public class A{ 
    public A(int... a){} 
} 

public class B extends A{ 
    public B(double[] b){ 
     super(b.length); 
    } 
}