正在初始化构造函数中的数组(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
}
}
叶氏,尝试:
super(new int[]{b.length}); //ERROR NO MORE
不,只会使数组等于将b.length的长度。我想要的长度是1,并且第一个(也是唯一的)条目的值是b.length。 – user828835
@ user828835固定 – OscarRyz
你也可以
public class A{
public A(int... a){}
}
public class B extends A{
public B(double[] b){
super(b.length);
}
}
谢谢,我不知道你可以同时声明和初始化这样的数组。这正是我正在寻找的。 – user828835
然而,你的第一个解决方案仍然不起作用,因为你在构造函数的第一行中缺少对super()的调用,所以它会被自动调用。但由于我缺少构造函数A(),这会导致错误。不过谢谢你。 – user828835
第一个例子不会编译。你需要在第一行调用super/this构造函数。第二次通话+1。 – user802421