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
()
Вы не можете добавлять комментарии в эту тему: топик перемещен в архив.