Во-первых, вы должны использовать Character
методы для этого, а не решение для дома, а именно Character.isDigit()
для проверки действительности и Character.digit()
для получения значения:
char c = ...
if (Character.isDigit(c)) {
// it's a digit
}
int value = Character.digit(c, 10);
Почему вы получаете это предупреждение, объясняется 5.6.2 Двоичное числовое продвижение из Спецификации языка Java :
Когда оператор применяет двоичный
числовое продвижение на пару
операнды, каждый из которых должен обозначать
значение числового типа, следующее
правила применяются по порядку, используя расширение
преобразование ( §5.1.2 ) в преобразование
операнды по мере необходимости:
- Если один из операндов имеет тип
double
, другой преобразуется в
double
.
- В противном случае, если один из операндов имеет тип
float
, другой преобразуется
до float
.
- В противном случае, если один из операндов имеет тип
long
, другой преобразуется в
long
.
- В противном случае оба операнда преобразуются в тип
int
.
Итак, что происходит, когда вы выполняете вычитание, оба аргумента переводятся в int
с. Результат - int
. Когда вы попытаетесь присвоить int
char
, возможна потеря точности (32-разрядное число со знаком 16-разрядное значение без знака).
Альтернативный метод проверки - просто использовать регулярное выражение:
if (s.matches("\\d\\d-\\d\\d")) {
// it's ##-##
}
или, если вам нужно захватить группы:
Pattern p = Pattern.compile("(\\d\\d)-(\\d\\d)");
Matcher m = p.matcher(s);
if (m.matches()) {
System.out.println(m.group(1)); // first group
System.out.println(m.group(1)); // second group
}