Почему поплавок помещается в двойник, а поплавок[] не помещается в двойник[]?
Если у меня есть функция, которая принимает 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 ответа:
В Java массивы не являются примитивным типом данных; вместо этого они имеют типObject . Как следствие, вы не можете преобразовать массив одного примитивного типа в массив другого примитивного типа напрямую (даже если вы можете привести отдельные элементы в массиве к другому типу).
Это потому, что преобразование типа implicite происходит, когда вы передаете значение float в метод whitch требует double one. Но между массивами float[] и double[] нет преобразования типов.
A
float
-это 4-байтовый тип, а Adouble
- 8-байтовый тип. Расширение одногоfloat
доdouble
является операцией постоянного времени. Однако для расширенияfloat[]
доdouble[]
требуется полная копия, и требуется линейное время, чтобы расширить весь массив. Поэтому Java не будет делать это неявно-она не будет делать вид, что операция так же дешева, как операция O(1).