2014-12-28 3 views
1

Я немного запутался в литье по типу в целом.Тип Casting vs. Другие методы

Как я понимаю на данный момент (или, возможно, неправильно понял его), тип casting - это просто способ изменить тип данных переменной. Например, когда у меня есть:

String stringVar = "1"; 

Я мог бы изменить тип данных STRINGVAR в целое с:

int intVar = (int)stringVar; 

Правильно?

Но я мог бы так же хорошо использовать для достижения тех же целей:

int intVar = Integer.parseInt(stringVar); 

Я также видел другие методы преобразования типов данных. Так что я должен просто подумать о типе кастинга и о тех методах, как о нескольких способах достижения одного и того же, или все они как-то разные?

Кроме того, я тоже видел что-то подобное, это хорошая практика или просто избыточно?

String stringVar = (String)intVar.toString(); 

ответ

1

Вы не можете бросить String к int, так что преобразование может быть сделано только для очень конкретных String с (которые содержат только цифры, и не слишком много цифр). Кастинг работает только в том случае, если тип источника может быть преобразован в целевой тип. JLS имеет строгие правила, касающиеся того, какие типы могут быть преобразованы в какие типы. Некоторые преобразования выполняются автоматически, в то время как другие требуют явного приведения.

Для того, чтобы преобразовать строку в целое число, вы должны использовать Integer.parseInt(stringVar) или Integer.valueOf(stringVar).

Что касается (String)intVar.toString(), то прежде всего он будет работать только если intVar есть Integer (не int). И литье до String является избыточным, так как toString уже возвращает String.

+0

Спасибо за освобождение. Поэтому на практике, когда я должен использовать кастинг типов и когда следует использовать другие методы, при условии, что оба параметра работают? – Nyecodem

+0

@Nyecodem Вы должны прочитать раздел JLS, к которому я привязан. В общем случае вы используете кастинг для ссылочных типов, когда целевой класс является подклассом исходного класса (или реализует интерфейс источника) после проверки того, что кастинг действителен (с использованием instanceof).Для примитивов вам необходимо выполнить явное преобразование при суживании конверсий (например, long-int), поскольку такие преобразования могут потерять данные. Если кастинг работает, я не могу придумать никаких причин для вызова метода для того же преобразования. – Eran

1

Нет, вы не можете преобразовать String в int путем литья. Кастинг не автоматически конвертирует объекты из одного типа в другой *.

С литой вы избегаете проверки типа компилятора. Вы говорите компилятору «У меня есть этот объект здесь, и я знаю лучше, чем вы, что это точно, поэтому я хочу, чтобы вы относились к нему так, как будто это тип X». Автоматическое преобразование не будет выполнено.

Компилятор не проверяет тип объекта, но проверка типа будет выполняться - во время выполнения, а не во время компиляции. Если при запуске программы неправильный тип, вы получите ClassCastException.

*: Есть некоторые автоматические преобразования, когда вы отбрасываете из одного примитива типа в другой, но не с ссылочными типами.

+0

Спасибо! Это имеет больший смысл. – Nyecodem