2012-03-09 44 views
0

下面的代码在C#中:相当于Java C#Array.Copy

public void DoSomething(float[][] array){ 
    for (int i = 0; i < array.GetLength(0); i++) 
    { 
     int len = array[0].length; 
     double[] copy = new double[len]; 
     Array.Copy(array[i], copy, len); 

     ... 
    } 
} 

我试图将其转换成Java。我尝试这样做:

public void DoSomething(float[][] array){ 
    for (int i = 0; i < array[0].length; i++) 
    { 
     int len = array[0].length; 
     double[] copy = new double[len]; 
     copy = Arrays.copyOf(array[i], len); 

     ... 
    } 
} 

但我得到的错误信息:

类型不匹配:不能从float []转换翻番[]

我能做些什么,使之在Java中工作?

+0

定义“产生不同的结果”。不同于*什么*确切? – Bohemian 2012-03-10 08:21:11

+0

请注意,它不是在C#中投射。这是一个转换。从.NET [文档Array.Copy(Array,Array,int)'](http://msdn.microsoft.com/en-us/library/k4yx47a1.aspx):“类型兼容性定义如下: [...]如果从源类型到目标类型的复制是扩展转换,则两个内置(预定义)值类型是兼容的[...]有关转换的更多信息,请参见[Convert.ToDouble(float) ](http://msdn.microsoft.com/en-us/library/kc01y017.aspx)“ – 2013-11-04 13:26:52

回答

2

您正试图将float的数组分配给double的数组。试试这个:

pubic void DoSomething(float[][] array){ 
    for (int i = 0; i < array[0].length; i++) 
    { 
     int len = array[0].length; 
     float[] copy = new float[len]; // Note change to array type 
     copy = Arrays.copyOf(array[i], len); 

我不能为C#说话,但Java是一种“强类型”的语言,这意味着你不能做这样的事情,你正在尝试什么。在java中,一个float可以投射到doublefloat[]可以而不是投射到double[]

0

使用

System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length) 

方法您的阵列的整体部分复制到另一阵列。 (JavaDocs

+1

该方法将编译,但它不会运行。从JavaDoc中链接到:“抛出ArrayStoreException ... [if] src参数和dest参数引用其组件类型是不同基元类型的数组。 – yshavit 2012-03-09 19:52:28

+0

而这就是忽略了这样的事实,即如果它*运行*因为精度差异而要求您遇到麻烦。 – 2012-03-09 19:54:14

+0

@BrianRoach原则上,他们可以检查并将其转化为循环标准,在循环中他们通过常规规则将“浮动”推广为“双倍”。但是,这将打破拥有基本上只是memcpy的本地超高速方法的全部目的。 – yshavit 2012-03-09 19:56:22

2

因为在Java doublefloat是不一样的东西,并有不同的精度。 (参见:http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

编辑补充:至于如何使它工作,你需要做手工铸造每个元素double。但是,您可能会遇到精度问题;见:Convert float to double without losing precision

+0

我的问题的一部分是为什么C#允许它。我猜它隐式地投射数组。是这样吗?是否有方法在Java中进行转换/转换? – adam0101 2012-03-09 19:57:04

+0

float []不能转换为double [] – Bohemian 2012-03-09 19:57:35

+0

@ adam0101 - 我不是C#的人,我不得不去查找它。正如我提到的,你可以*在Java中将'float'强制转换为'double',但是结果值可能不是你想要的。你试图使用的函数不会为你做这件事,你必须自己编写循环并且执行演员。数组本身不能被投射。 – 2012-03-09 20:01:43