在构造函数中动态初始化数组(Java)

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

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

我希望能够编译上述代码。为了澄清,我有一个扩展类A和B。类A没有空参数构造函数。如果我在Class B的构造函数中没有在第一行放置对super的调用,它将尝试调用不存在的super()。但是,我想调用super(int[] a)。我想通过取给定双重数组的长度并将其作为长度为1的数组发送来实现这一点。它不允许我这样做,因为显然不能声明这样的数组,如果我在单独的一行上声明它,它会先调用super(),这不起作用。
有没有办法像那样即时声明int[]?还是唯一的解决方案是要么为A创建一个没有参数的构造函数,要么创建自己的函数返回int[]?
(不要问我为什么要以这种方式发送它。)
3个回答

11

如果你一定不想问为什么...

你可以创建数组,分配第一个且唯一的元素并发送它。

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
      }
}

谢谢,我不知道你可以同时声明和初始化数组。这正是我正在寻找的。 - user828835
然而,你的第一个解决方案仍然不能运行,因为在构造函数的第一行你缺少 super() 的调用,所以它被自动调用。但是由于我没有构造函数 A(),这将导致错误。无论如何,还是谢谢。 - user828835
第一个例子无法编译。你需要在第一行调用super/this构造函数。第二个exp +1。 - user802421
你不能在第一段代码中这样调用 super。正确的答案是第二个。 - OscarRyz

4

好的,试试这个:

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

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

4
你也可以。
 public class A{
    public A(int... a){}
 }

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

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