Преобразование данных Java - PullRequest
       8

Преобразование данных Java

0 голосов
/ 21 октября 2009
char c='c';
int i=10;
double d =50;
long l=30;
String s="Goodbye";

Являются ли эти утверждения действительными?

s+=i;
i+=s;
c+=s;
c=c+i;

Может ли кто-нибудь объяснить логику преобразования типов данных

Ответы [ 5 ]

3 голосов
/ 21 октября 2009

Почему бы вам не попробовать?

bash-3.2$ cat ConveraionTest.java 
    public class ConvertsonTest {
        public static void main( String [] args ) {
            char c='c';
            int i=10;
            double d =50;
            long l=30;
            String s="Goodbye";

            //Are these statement valid?

            s+=i;
            i+=s;
            c+=s;
            c=c+i;
        }
    }
bash-3.2$ javac ConversionTest.java 
ConversionTest.java:12: incompatible types
found   : int
required: java.lang.String
            i+=s;
            ^
ConversionTest.java:13: incompatible types
found   : char
required: java.lang.String
            c+=s;
            ^
ConversionTest.java:14: possible loss of precision
found   : int
required: char
            c=c+i;
               ^
3 errors

EDIT

Длинная история

По сути, все типы в java имеют «форму», если вы хотите так ее назвать (ну, я собираюсь так назвать для этого ответа)

Для примитивов типов данных (логическое, байтовое, короткое, char, int, float, long, double) «shape» - это размер в байтах, который он использует (или в битах, здесь 1 байт = 8 бит):

boolean = true or false  
byte = 8 bits
short = 16 bits
char = 16 bits
int = 32 bits
float = 32 bits
long = 64 bits
double = 64 bits

«Форма» объектов варьируется в зависимости от класса.

Итак, в принципе вы можете назначить что угодно чему угодно, пока они вписываются в «форму»

Таким образом, вы можете назначить int для long (можно сделать 32 бита для 64-битных), короткое (16) для целого (32) и т. Д.

То, что вы не можете сделать, это назначить что-то, что не вписывается в форму.

So

ConversionTest.java:12: incompatible types
found   : int
required: java.lang.String
            i+=s;
            ^

Вы не можете присвоить String в int. Как бы ты? Куда пойдет содержимое? Они не имеют одинаковую «форму» и даже не совместимы.

То же самое относится к String до char

ConversionTest.java:13: incompatible types
found   : char
required: java.lang.String
            c+=s;
            ^

Теперь вы можете присвоить int (32 бита) для символа (16 бит) или для короткого (16 бит). Проблема заключается в том, что если значение содержит> 16 бит (например, 131 071)

Вы потеряете биты, которые не вписываются в 16 бит. Вот почему вы получаете эту ошибку:

ConversionTest.java:14: possible loss of precision
found   : int
required: char
            c=c+i;

Однако, если вы уверены, что он подходит (например, int i = 65;, который, безусловно, вписывается в 16 бит), вы можете привести его, вот так:

 int i = 65;
 char c = ( char ) i;

Приведение так, как вы говорите компилятору:

Эй, я здесь программист, я знаю, что делаю .

2 голосов
/ 21 октября 2009

Да, нет, нет, нет (если вы явно не выполняете передачу типа). Если бы вы написали простой main метод, скомпилировали и выполнили его, вы могли бы увидеть это - эти проблемы должны быть определены компилятором.

Эта страница о примитивных типах данных Java объясняет это довольно хорошо.

1 голос
/ 21 октября 2009

Существует два типа конверсий: расширяющиеся конверсии и сужающиеся конверсии. Расширяющиеся преобразования разрешены, и Java будет обрабатывать это для вас, но сужающие преобразования не допускаются. Расширяющиеся преобразования означают, что вы преобразуете «меньшее» значение, такое как int (32 бита), в «большее» значение, такое как long (62 бита). Сужающие преобразования, которые идут другим путем, должны быть сделаны явно.

 s+=i;

потребует преобразования int в строку, которая разрешена.

i+=s;

Потребуется преобразовать строку в int, что недопустимо. Оператор + = переведет в

i = i + s;

и i + s вернет строку, которую нельзя присвоить целому.

c+=s;

Этого нельзя допустить по той же причине, что c + s возвращает строку, которую вы пытаетесь присвоить символу.

c=c+i;

также выдаст ошибку, потому что c + i приведет к int (32 бита), а присвоение его символу (16 бит) может привести к потере точности.

Каждая из выполняемых вами операций на самом деле возможна, но вы должны явно указать Java, что вы хотите их выполнить и примете последствия. Сказав, что операции смешанного типа недовольны на полностью чистой программной арене, поскольку существуют крайние случаи, которые потенциально могут вызвать проблемы.

1 голос
/ 21 октября 2009
char c='c';
int i=10;
double d =50;
long l=30;
String s="Goodbye";

s+=i; // legal :)
i+=s; // not legal :( The operator += is undefined for the argument types int, String
c+=s; // not legal :( The operator += is undefined for the argument types char, String
c=c+i; // not legal :( Type Mismatch: cannot convert from int to char

Полное объяснение преобразования типов данных Java является длинным и подробным.

0 голосов
/ 21 октября 2009

s + = i объединит s и строку "10", это равно s + = ((Integer) i) .toString ();

я + = s не думаю, что это будет работать, типы несовместимы

c + = s также не должен компилировать одинаковые несовместимые типы.

c = c + я должен добавить 10 к значению ascii c, чтобы c стало 10-ой буквой после 'c' => 'm', я думаю

EDIT. Так что в последнем случае вы должны привести i к char, чтобы он компилировался.

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