Передача char в метод с параметром int - PullRequest
8 голосов
/ 28 октября 2011

Вывод следующего кода: 123, потому что substring переводится из beginIndex в EndIndex - 1. Однако я удивлен, как char здесь понимается как 3 (int), поскольку substring занимает два целых числа.Что за концепция стоит за этим?

String x = "12345";
char a = 3;
x = x.substring(0, a);
System.out.println(x);

Ответы [ 7 ]

12 голосов
/ 28 октября 2011

Все это возвращается к C , где char по сути является узким целочисленным типом и неявно преобразуется в int при необходимости.

В Javaтехнически известен как «расширяющееся примитивное преобразование» и рассматривается в разделе 5.1.2 JLS .

3 голосов
/ 28 октября 2011

Другие уже объяснили, почему это работает, но отмечают, что использование переменных типа char для индексов является плохой практикой, поскольку они имеют различную связанную семантику и, следовательно, использование char в качестве индекса непонятно.

Используйте символы только для хранения символьных данных и, возможно, лучше: старайтесь вообще избегать символов, поскольку они даже недостаточно широки, чтобы хранить каждый символ (см. Обсуждение Unicode и кода). Вместо этого используйте int для хранения кодовых точек.

0 голосов
/ 28 октября 2011

Технически, это потому, что char является подтипом int.

Чтобы определить, применимо ли substring(int,int) к аргументу (int,char), мы сначала попробуем 15.12.2.2 Этап 1: Определите подходящие методы Arity, применимые подтипом , нам нужно проверить, является ли char подтипом int. В соответствии с 4.10.1 Подтипирование среди примитивных типов , это.

Затем, чтобы присвоить аргумент char параметру int, для 15.12.4.5 Создать кадр,Синхронизация, передача управления , мы применяем 5.3 Преобразование вызова метода , которое преобразует char в int, для 5.1.2 Расширяющее примитивное преобразование

0 голосов
/ 28 октября 2011

В char a = 3; вы можете думать о том, что он хранит 0011, двоичное значение 3. Символ '3' на самом деле не сохраняется: если вы попытались обработать это символ, вы не получите 3. Но если вы сделали

char a = '3';

Теперь вы храните char 3, значение ascii 51, и если вы попытаетесь использовать его как в int, вы получите 51.

0 голосов
/ 28 октября 2011

Это известно как неявное приведение. То же самое происходит, если вы присваиваете значение типа int двойному. Быстрый пример

    double d = 1;

1 - это int, но оно неявно приводится к double (1.0).

0 голосов
/ 28 октября 2011

Взгляните на раздел 5.1.2 , где обсуждаются расширяющиеся преобразования.

0 голосов
/ 28 октября 2011

поэтому объявление функции подстроки выглядит как подстрока (int startIndex, int endIndex).Теперь, когда вы передаете char, он автоматически переводится в целое число (endIndex) и, следовательно, рассматривается как int.

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