как проверить, передается ли символ как int - PullRequest
1 голос
/ 08 мая 2009

Можно ли проверить, был ли символ передан в метод, который требует int? Например, если у вас есть какая-то функция foo (int bar) и кто-то использует эту функцию, например, foo ('t'), Вы можете узнать, что был введен символ, а не int? Я знаю, что char преобразуется в int, но я пытаюсь ограничить что-либо, кроме чистых целых чисел, проходящих через функцию.

Приветствия

Ответы [ 6 ]

9 голосов
/ 08 мая 2009

Нет, это невозможно, потому что сама Java обновляет char до int, если может.

Вы можете сделать перегрузку вашей функции, которая принимает параметр char вместо int, что может вызвать исключение, но это не помешает никому преобразовать char в int и вызвать int версия.

Нет абсолютно никакой разницы между символьной константой 'A', приведенной к целому числу и целому числу 65, поэтому было бы совершенно невозможно различить регистры.

Обновление от Pax:

Я бы сказал, что явное приведение НЕ передает char, а вызывающий преобразовывает char в int, а затем передает int. Это решение ловит случайное прохождение char.

Извлечение чьего-либо кода из другого ответа:

public class Test {
    private static void someMethod(char c) throws Exception {
        throw new Exception("I don't think so, matey!");
    }
    private static void someMethod(int i) {
        System.out.println(i);
    }
    public static void main(String[] args) throws Exception {
        someMethod(100);
        someMethod('d');
    }
}

В результате:

100
Exception in thread "main" java.lang.Exception: I don't think so, matey!
    at Test.someMethod(Test.java:4)
    at Test.main(Test.java:13)
8 голосов
/ 08 мая 2009

Вы можете использовать Integer вместо int.

void foo(Integer bar) { }

Если вы попытаетесь вызвать foo ('A'), вы получите ошибку компилятора.

4 голосов
/ 08 мая 2009

Я пытаюсь ограничить что-либо другое чем чистые целые числа, проходящие через функция.

У вас небольшое концептуальное несоответствие с Java. char в Java - это просто число; тот факт, что вы используете тип char вместо типа int, заключается в том, что вам нужно число, равное 16 битам вместо 32 бит.

A char - это просто число, которое идет от 0 до 65535. int - это просто число, которое идет от –2 147 483 648 до 2 147 483 647.

Теперь я понимаю, что вы хотите запретить людям называть ваш метод бессмысленными вещами, такими как foo('t'). Однако, как только ваша программа скомпилирована, Java фактически преобразует этот вызов в foo(116).

Фактически, кто-то, вызывающий ваш метод с символом в качестве параметра, столь же глуп, как и вызывающий ваш метод с произвольным числом. Если вы застряли в такой ситуации, рассмотрите следующие возможности:

  • Дают ли некоторые символы неверный ввод для вашего метода?

    Например, вы хотите, чтобы значение яркости находилось в диапазоне от 0 до 255, а setBrightness('Δ') на самом деле setBrightness(916).

    Бросьте исключение - вы все равно должны это делать!

  • Хотите ли вы проанализировать символ, представляющий числовое значение?

    Например, вы хотите, чтобы значение яркости находилось в диапазоне от 0 до 9, а setBrightness('5') на самом деле должно быть setBrightness(5).

    Разбор символа как строки.

_

char a = '5';
String a_s = String.valueOf(a);
int a_i = Integer.parseInt(a_s);
setBrightness(a_i)
  • Метод делает все правильно, но глупо передавать символ в качестве параметра?

    Например, вам нужно значение яркости от 0 до 1 000 000, а setBrightness('q') просто натирает вас неправильно.

    Оставь это в покое. Вызов setBrightness('q') - это плохая форма, но это проблема другого кодера. Не делай это сам! Вы пинаете себя позже, когда копаетесь в таблице Unicode, пытаясь понять, что вы имели в виду в то время.

3 голосов
/ 08 мая 2009

Приведение от char к int произойдет во время компиляции, поэтому невозможно будет определить, был ли передан char или int.

Чтобы проиллюстрировать это, давайте рассмотрим исходный код и результирующий байт-код программы, которая имеет someMethod(int), который вызывается путем передачи char и int:

Исходный код:

class CharIntCast
{
    private static void someMethod(int i)
    {
    }

    public static void main(String[] args)
    {
        someMethod(100);
        someMethod('d');
    }
}

Bytecode:

Compiled from "CharIntCast.java"
class CharIntCast extends java.lang.Object{
CharIntCast();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   return

private static void someMethod(int);
  Code:
   0:   return

public static void main(java.lang.String[]);
  Code:
   0:   bipush  100
   2:   invokestatic    #2; //Method someMethod:(I)V
   5:   bipush  100
   7:   invokestatic    #2; //Method someMethod:(I)V
   10:  return

}

Как видно из байт-кода, оба значения 100 и 'd' уже обрабатываются как целое число, когда они помещаются в стек инструкцией bipush перед вызовом someMethod.

Следовательно, во время выполнения невозможно будет определить, был ли аргумент метода int или char, так как приведение выполняется компилятором.

1 голос
/ 08 мая 2009

Я так не думаю.

0 голосов
/ 08 мая 2009

Если ваши целые числа не ограничены диапазоном, который находится за пределами диапазона символа, вы не сможете этого сделать, поскольку не можете определить, является ли значение 64 целым или типным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...