Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 类构造函数不区分参数。。。和args[][]_Java_Oop_Constructor - Fatal编程技术网

Java 类构造函数不区分参数。。。和args[][]

Java 类构造函数不区分参数。。。和args[][],java,oop,constructor,Java,Oop,Constructor,受学校线性代数I和II课程的启发,我目前正在用java编写一个线性代数库 我希望我的程序尽可能灵活,因此决定我的Matrix类将有许多可用的构造函数。但是,当我尝试将这两个构造函数放在一起时,Java会抛出一个编译错误: public Matrix(double[]... rows) { ... } public Matrix(double[][] matrix) { ... } 我不明白为什么,因为第一个构造函数将接受任意数量的double[]数组作为参数:Matrix-Matrix=ne

受学校线性代数I和II课程的启发,我目前正在用java编写一个线性代数库


我希望我的程序尽可能灵活,因此决定我的
Matrix
类将有许多可用的构造函数。但是,当我尝试将这两个构造函数放在一起时,Java会抛出一个编译错误:

public Matrix(double[]... rows) { ... }

public Matrix(double[][] matrix) { ... }

我不明白为什么,因为第一个构造函数将接受任意数量的
double[]
数组作为参数:
Matrix-Matrix=new-Matrix(r1、r2、r3…等)
而第二个构造函数将只接收一个
double[]
arg:
Matrix-Matrix=new-Matrix(arr)
。我意识到,在两个构造函数中,我将处理相同的数据结构(一个双精度的2D数组),但这里没有关于输入类型的歧义,这就是为什么这对我来说很奇怪。

类型…
相当于
类型[]
(至少就方法参数声明和方法实现而言)从这个意义上讲,
Type[].
等同于
Type[][].[].
,这解释了
double[].
如何被视为
double[].[].

对于JVM,varargs之间没有区别(
..
)或数组(
[]
),它在运行时只看到一个数组


另请参见

,因为,
..
[]
的语法糖,“我希望我的程序尽可能灵活”。这种灵活性就像在汽车后座上放一个水池,以防你需要带鲨鱼去看兽医。选择一种一致的方法,并坚持下去。为什么?当你想到它时,它是完全有意义的。将数组看作向量的表示,然后使用
,然后再想想矩阵乘法和约化,然后使用
double[][]
,无论如何,这是为了学习而不是生产代码,因此雅格尼在这里不相关。矩阵在逻辑上是二维数组。如果您有矩阵方法
方法(double[])
,然后您可以使用1d数组参数调用它,这可能不是您想要的;如果参数是
double[][]]
,您就不能犯这种类型错误。但是在YAGNI方面:为什么您认为变量形式有帮助?它允许您编写
方法(新的double[]{1,0},新的double[]{0,1})
;但是为什么选择这个方法而不是更简洁的
方法(新的double[][{{1,0},{0,1}})
?唯一可能有用的情况是,如果您有预先构造的行数组,那么您可以编写
方法(第1行,第2行)
;但是我可以诚实地说,我从来没有(或者至少很少)这样做过需要这样的功能,在过去的几天里我已经做了相当多的线性代数。最终,我是一个符号,而不是一个警察;你听的时候不会感到内疚。这不是等价的:如果方法是
foo(int[])
,你就不能调用
foo(1,2,3)
;但是如果方法是
foo(int[]{1,2,3}),你可以调用
foo(new int[]
(int…)
@AndyTurner它们在声明var arg/array的方法中是等价的。但这是一个很好的观点。编辑答案。