Инициализация двойного объекта Java с другими объектами числового типа

В документации по двойным объектам он имеет только два конструктора, один из которых принимает двойное значение, а другой - строковое значение. Однако я только что обнаружил, что если мы инициализируем его с другими объектами типа Number, он также будет работать Например, следующий код будет работать:

Integer i = Integer.valueOf(10);
Double d1 = new Double(i);
Long l = Long.valueOf(100);
Double d2 = new Double(l);

Так что мне интересно, что за этим стоит? Автобокс / распаковка будет выполнять преобразование между Double/double, Long/long и Integer/int, но я не понимаю, почему конструктор Double будет принимать другие типы данных.

1 ответ

Решение
Long l = Long.valueOf(100);
Double d2 = new Double(l);

Приведенный выше код не делает Double(Long) звоните, это делает доступным Double(long) вызов с распакованным параметром из Long в long, Это работает только потому, что long совместим с double,

Так:

Однако я только что обнаружил, что если мы инициализируем его с другими объектами типа Number, он также будет работать

Нет, вы все еще вызываете тот же конструктор, который принимает double в качестве параметра.

Как примечание, когда у вас есть Number объект под рукой, скорее назовите его doubleValue() метод, чтобы получить примитив, вместо создания другого объекта, создавая его с помощью new Double(long)

Другие вопросы по тегам