Почему поплавок помещается в двойник, а поплавок[] не помещается в двойник[]?


Если у меня есть функция, которая принимает double в качестве аргумента, я могу легко ввести float.

Однако, когда у меня есть функция, которая принимает double[], то я не могу передать float[].

public static void doSomethingWithMyDoubles(double[] doubles) {
    //....
}

public static void doSomethingWithMyDouble(double doubles) {
    //....
}

public static void main() {
    float floater = 10f;
    double doubler = 10d;

    doSomethingWithMyDouble(doubler) // OK
    doSomethingWithMyDouble(floater) // OK

    float[] floates = new float[10];
    double[] doubles = new double[10];

    doSomethingWithMyDoubles(doubles) // OK
    doSomethingWithMyDoubles(floates) // NOK
}
4 2

4 ответа:

В Java массивы не являются примитивным типом данных; вместо этого они имеют типObject . Как следствие, вы не можете преобразовать массив одного примитивного типа в массив другого примитивного типа напрямую (даже если вы можете привести отдельные элементы в массиве к другому типу).

Это потому, что преобразование типа implicite происходит, когда вы передаете значение float в метод whitch требует double one. Но между массивами float[] и double[] нет преобразования типов.

A float-это 4-байтовый тип, а A double - 8-байтовый тип. Расширение одного float до double является операцией постоянного времени. Однако для расширения float[] до double[] требуется полная копия, и требуется линейное время, чтобы расширить весь массив. Поэтому Java не будет делать это неявно-она не будет делать вид, что операция так же дешева, как операция O(1).

Это потому, что float и Double-примитивы. Поплавки могут быть автоматически разыграны в двойники. Однако double [] и float[] являются объектами. Попробуйте явный кастинг. Возможно, Вам потребуется выполнить итерацию и приведение каждого элемента и вставить его в новый массив.