Общая арифметика Java

Я пытаюсь создать несколько классов Java, которые должны работать либо с числами с плавающей запятой, либо с числами типа double (для целей моделирования я должен поддерживать оба). Классы должны выполнять базовую арифметику, а также использовать тригонометрические функции (sin, cos, atan2).

Я попытался применить общий подход. Поскольку Java не допускает примитивных типов в обобщениях, а MyClass<T extends Number> действительно допускает Double и Float, но делает невозможной базовую арифметику, я создаю класс-оболочку вокруг Double и Float. Но этот подход терпит неудачу, как только мне нужно создать экземпляр значения в одном из общих классов.

Есть ли чистый способ поддерживать как float, так и double, без дублирования всего кода для каждого типа?


person crater2150    schedule 17.12.2012    source источник
comment
Если вы напишете метод для double, вы можете использовать его и для float.   -  person Thihara    schedule 17.12.2012
comment
Вам нужно работать с классами-оболочками или с примитивами?   -  person Andrew Logvinov    schedule 17.12.2012
comment
@Thihara Да, но тогда метод вернет значение типа double, независимо от типа его параметров. Мне нужно оставаться с заданной точностью.   -  person crater2150    schedule 17.12.2012
comment
@AndrewLogvinov: Мне не нужно использовать классы-оболочки Number, но для использования коллекций было бы полезно, если бы в решении можно было использовать какой-то класс-оболочку. В основном мне нужно заниматься арифметикой. Только с примитивами мне пришлось бы писать все методы один раз для каждого типа, если возможно, я хочу этого избежать.   -  person crater2150    schedule 17.12.2012
comment
Если вы используете Number, вам нужно будет выполнить проверки, чтобы убедиться, что его срабатывает Doubles и Floats, которые прошли ...   -  person Thihara    schedule 17.12.2012


Ответы (2)


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

Есть ли чистый способ поддерживать как float, так и double, без дублирования всего кода для каждого типа?

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

public static double calc(double x, double y) {
   // do the calculation and return double
}

public static float calc(float x, float y) {
   return (float)calc((double)x, (double)y);
}
person NPE    schedule 17.12.2012
comment
спасибо, решил использовать что то подобное. Не такой общий, как я надеялся, но не похоже, что в Java есть способ, которым универсальные методы и арифметика хорошо работают вместе. - person crater2150; 18.12.2012

Может это то, что вы ищете?

class MyClass<T extends Number> {
    T add(T t1, T t2) {
        if (t1 instanceof Double) {
            return (T) Double.valueOf((t1.doubleValue() + t2.doubleValue()));
        } else if (t1 instanceof Float) {
            return (T) Float.valueOf(((t1.floatValue() + t2.floatValue())));
        } else if (t1 instanceof Integer) {
            return (T) Integer.valueOf(((t1.intValue() + t2.intValue())));
        }
        // you can add all types or throw an exception
        throw new IllegalArgumentException();
    }

    public static void main(String[] args) {
        MyClass<Double> mc = new MyClass<Double>();
        mc.add(1.0, 1.1);
    }
}
person Evgeniy Dorofeev    schedule 17.12.2012