LINUX.ORG.RU

Java - арифметика над типами - обертками числовых

 


0

2

Не хотел связываться с Java - но захотел наваять под Андроид, а экзотику Scala|Clojure|Cotlin|C# и т.п. постеснялся, решил попробовать на нативно мейнстримовом языке. Но пока тестирую десктоп вариант, логику. Суть проблемы - у меня есть самописный (хотя не суть) односвязный список с элементами типа Object. Соответственно, числа в нем представлены типами- обертками Double, Integer. Список читаю из строки, заполняется нормально, при чтении определяю нужный тип числа. А дальше, например, мне надо сложить все элементы списка и получить также значение типа Object - Double или Integer. Если в списке у меня значения одного типа - работает нормально, если разных - пишет ошибка, не могу кастовать. Кастую вручную в каждой элементарной операции к более широкому Double - тоже отказывается. Как это победить? В принципе меня даже более чем устроит если будут операции над оберткой Number с автоматическим определением типа результата. Или хотя бы каст к более широкому типу.



Последнее исправление: Ivana (всего исправлений: 1)

Напиши свою собственную обёртку/обёртки над числовыми типами и собственный механизм сложения, который будет разруливать тонкие моменты. Я думаю, что это самый простой способ.

mono ★★★★★
()

Используй java.lang.Number, от него наследуется и Double и Integer. У него есть метод doubleValue, используй его, получишь как раз то, что хочешь.

Legioner ★★★★★
()
Последнее исправление: Legioner (всего исправлений: 1)
Ответ на: комментарий от Legioner

Спасибо, похоже это то что надо. До конца не проверил, но может я вообще буду возвращать и оперировать сразу объектами класса Number. Или если так не получится красиво, то кастовать к родительскому объекту и применять его методы, благо они есть.

Ivana
() автор топика

Я, обычно, если требовалось возвращать то int, то double, просто хранил всё double. Прямо вот так, объявить список Double, которые будут нормально кастоваться к Integer.
Кстати, в чем состоит задача?

GblGbl ★★★★★
()
Ответ на: комментарий от GblGbl

Мне в списке помимо разных чисел и строк надо хранить много других объектов, включая те же списки. Задача простая - хотел написать первую игрушку под Андроид - РЕПЛ интерпретатора Лиспа, типа консольного диалога: вводишь команду - он выполняет и показывает результат, плюс можно отдельной командой загрузить файл с кодом и он выполнится. До Андроида пока не дошел, а на десктопе уже отлично работает на ура - спасибо Legioner.

Ivana
() автор топика

К более «широкому» Double? Когда это Double стал более широким в Java чем Integer? Они на одном уровне и оба они наследуются от Number. Никаких автоматических исключений для «числовых» коробочных типов Java не делает.

Соответственно, методика кастования здесь должна быть такой:

Double sum = new Double(0);
foreach (Number element : list) { sum += element.doubleValue(); }
anonymous
()
Ответ на: комментарий от anonymous

Да, так уже и сделал, благо в каждом из наследников Number есть методы кастования в соседа.

Скажите лучше, на чем гуй репла написать. Сейчас в недотерминале Windows 7 (только не бейте на этом сайте за такие слова )))) работает, но хочется выделения цветом фона и стилем шрифта уровней скобочных выражений, многострочного ввода и т.п. Swing? Или сразу JavaFX? Или что-то другое? Пишу в IDEA, в перспективе хочу портировать на Андроид.

ЗЫ и да, если порекомендуете вариант прерывания долгих вычислений без закрытия приложения (у меня все в одном потоке, дешево и просто), то будет хорошо. А то запустит юзер экспоненциальных Фибоначчей от аргумента > 40 и никак это дело не прервется, только приложение аварийно закрывать.

Ivana
() автор топика
Ответ на: комментарий от Ivana

если порекомендуете вариант прерывания долгих вычислений без закрытия приложения (у меня все в одном потоке, дешево и просто), то будет хорошо. А то запустит юзер экспоненциальных Фибоначчей от аргумента > 40 и никак это дело не прервется, только приложение аварийно закрывать.

Самый тупой вариант,

// если не влом писать везде throws то юзай InterruptedException
class MyInterruptException extends RuntimeException {}

public class InterruptionSupport {
  public static void checkInterrupt() {
// пишу по памяти так что кури документацию
     if(Thread.currentThread().interrupted()) {
        throw new MyInterruptException();
     }
  }

}

Потом в своих циклах вызываешь checkInterrupt(), есесно со здравым смыслом, а снaружи вычислений ставишь try catch на вышеозначенный эксепшен и обрабатываешь корректно прерывание вычислений. Лучше конечно использовать InterruptedException или вообще не использовать эксепшены, но там все сложнее 8)

Deleted
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.