Почему я получаю Оператор - не определено для типа (ов) аргумента java.math.BigDecimal, сообщение об ошибке java.math - PullRequest
1 голос
/ 25 марта 2019
Collections.sort(employees, new Comparator<Employee>() {

    public int compare(Employee s, Employee s1) {
        int comp = s.getName().compareTo(s1.getName());
        if (comp != 0) {    // names are different
            return comp;
        }
        return s.getSalary() - s1.getSalary();
    }
});
System.out.println(employees);

}

Ответы [ 4 ]

6 голосов
/ 25 марта 2019

Используйте BigDecimal.compareTo(BigDecimal), который уже выполняет всю логику за вас:

return s.getSalary().compareTo(s1.getSalary());

Оператор - (минус) определен только для примитивных чисел и их специального типа оболочки.

2 голосов
/ 25 марта 2019

Более простой подход для определения Comparator в Java 8 +:

Comparator.comparing(Employee::getName).thenComparing(Employee::getSalary)
1 голос
/ 26 марта 2019

Спецификация языка Java ( JLS ) описывает применимость оператора - для арифметических операций:

15,18. Аддитивные операторы

В каждом случае тип каждого из операндов бинарного оператора должен быть типом, который можно преобразовать ( §5.1.8 ) в примитивный числовой тип, или компилировать возникает ошибка.

Тип BigDecimal не является ни примитивным числовым типом (таким как int, short, float, double), ни конвертируемым в единицу. Напротив, хотя Integer, Float, Double и Short также не являются примитивными числовыми типами, для них определен оператор -, поскольку они могут быть преобразованы в их примитивные аналоги ( JLS- 5.1.8 ).

Как уже указывалось в других ответах, используйте BigDecimal.compareTo (BigDecimal) для сравнения BigDecimal экземпляров.

0 голосов
/ 25 марта 2019

Как уже упоминалось, это не лучший способ решения проблемы, которую вы показали, однако нельзя использовать оператор минус в BigDecimal.Вам нужно использовать метод substract, чтобы избежать этой ошибки.

//s.getSalary() - s1.getSalary();
BigDecimal diff = s.subtract(s1);

Затем вы можете привести этот diff к int, используя .intValue().Будьте осторожны, так как это может привести к побочным эффектам из-за потери информации из BidDecimal в int ...

...