【问题标题】:Java equivalent of C# Array.CopyJava 等效于 C# Array.Copy
【发布时间】:2012-03-09 19:46:00
【问题描述】:

以下代码在 C# 中工作:

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[] 转换为 double[]

我该怎么做才能让它在 Java 中工作?

【问题讨论】:

  • 定义“产生不同的结果”。与 什么 不同?
  • 请注意,它也不是在 C# 中进行转换。这是一个转换。来自 .NET docs for Array.Copy(Array, Array, int):“类型兼容性定义如下:[...] 如果从源类型复制到目标类型是扩大转换,则两种内在(预定义)值类型是兼容的。[...]有关转化的更多信息,请参阅Convert.ToDouble(float)"

标签: java arrays type-conversion


【解决方案1】:

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

public 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 of array type
        copy = Arrays.copyOf(array[i], len);

我不会说 C#,但 java 是一种强类型语言,这意味着你不能做你尝试过的事情。在 java 中,float 可以转换为 doublefloat[] 可以转换为 double[]

【讨论】:

    【解决方案2】:

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

    编辑添加:至于如何使其工作,您需要手动将每个元素转换为double。但是,您可能会遇到精度问题;见:Convert float to double without losing precision

    【讨论】:

    • 我的部分问题是为什么 C# 允许它。我猜它隐式地转换了数组。是这样吗?有没有办法在 Java 中进行转换/转换?
    • float[] 不能转换为 double[]
    • @adam0101 - 我不是 C# 人,我必须查一下。正如我所提到的,您可以在 java 中将 float 转换为 double,但结果值可能不是您想要的。您尝试使用的功能不会为您执行此操作,您必须自己编写循环并进行强制转换。数组本身不能只是强制转换。
    【解决方案3】:

    使用

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

    将数组的整个部分复制到另一个数组中的方法。 (JavaDocs)

    【讨论】:

    • 这种方法可以编译,但不会运行。从您链接到的 JavaDoc 中:“抛出 ArrayStoreException ... [if] src 参数和 dest 参数引用其组件类型为不同原始类型的数组。”
    • 这忽略了这样一个事实,即如果它确实运行了,考虑到精度差异,你就是在自找麻烦。
    • @BrianRoach 好吧,原则上他们可以检查并把它变成一个标准的循环,他们通过通常的规则将floats 提升为doubles。但这会破坏拥有一个基本上只是 memcpy 的原生、超快方法的全部目的。
    猜你喜欢
    • 2011-06-03
    • 2010-11-30
    • 1970-01-01
    • 1970-01-01
    • 2012-01-09
    • 1970-01-01
    • 2019-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多