Я всегда слышал (и думал) Java как строго типизированный язык. Но только недавно я заметил что-то, что я использовал почти ежедневно: int
и double
перегрузка.Java-примитивы и перегрузка
Я могу написать следующее, и это действительно код Java:
int i = 1;
double j = 1.5;
double k = i + j;
Но, если у меня есть метод, один из которых аргументов является double
, мне нужно указать его:
public static <K, V> V getOrDefault(K k, Map<K, V> fromMap, V defaultvalue) {
V v = fromMap.get(k);
return (v == null) ? defaultvalue : v;
}
Когда слово вышеупомянутого метода на Map<String, Double>
, то defaultvalue
аргумент не может быть int
:
getOrDefault(aString, aStringDoubleMap, 0); // won't compile
getOrDefault(aString, aStringDoubleMap, 0d); // compiles and runs just fine
Почему Java перегружает int
до double
(так же, как и в дополнение), а затем автобокс это до Double
? Я думаю, что ответ заключается в том, как Java выполняет перегрузку оператора (т. Е. Перегрузка происходит в операторе +
, а не от int
до double
), но я не уверен.
Здесь мы надеемся, что SO поможет мне в этом.
Вижу. Я думал, что Java будет * сначала конвертировать 0 в 0d (расширение конверсии, упомянутое Renjith и Andrew), и * then * autobox. Разумеется, преобразование из 'Integer' в' Double' не допускается, как вы указали. –