2015-02-08 4 views
-2
Class Example{ 
static void go(int a) 
{ 
    System.out.println(a); 
} 
public static void main(String[] args) { 

    go('c'); //prints 99 
} 
} 

Но если я изменяю метод на статический void go (байт), выдает ошибку: метод go (byte) в типе Example не применим для аргументов (char).Почему я могу передать char методу, который принимает int?

+0

'char' - 16 бит, а' byte' - 8 бит. Тем не менее, вы можете набросать символ (вы теряете данные): 'go ((byte) 'c');' но я не вижу в этом никакого значения. – alfasin

+1

@SarveshKumarSingh Я предполагаю, что OP * пытается * изучить Java. Будем полезны, а не значит. – dimo414

+0

@ dimo414 Я понимаю, и именно поэтому я сказал, что ...Я много тренировался в программировании, и я заметил, что большинство из них попытаются использовать ярлыки ... чтобы они могли «сделать свой код запущенным» в краткосрочной перспективе ... И они пытаются избежать кажущейся более скучной части пытаясь понять язык ... который вредит им и только им в долгосрочной перспективе. –

ответ

1

Это обусловлено расширяющее преобразование или неявной

If a value of narrower (lower size) data type converted to a value of a broader (higher size) data type without loss of information, is called Widening conversion. This is done implicitly by the JVM and also known as implicit casting. For example an integer data type is directly converted to a double.

Пример

int a = 100; 
double b = a; 
System.out.println(b); 

В приведенном выше примере integer (4 Byte) преобразованы в double (8 Byte)

Widening conversion is allowed in the following cases:

  • байты могут быть преобразованы в короткие, межды, длинная, с плавающей точкой, или двойную
  • Short может быть преобразована в целом, длинная, с плавающей точкой, или двойная
  • символа может быть преобразована в целое, длинная, с плавающей точкой, или двойной
  • INT может быть преобразован в длинный, поплавок, или двойная
  • долго может быть преобразовано, чтобы плавать или двойную
  • поплавка может быть преобразован в двойной

Implicit Type Casting

Теперь Приходя к

But, if i change the method to static void go(byte), gives error:The method go(byte) in the type Example is not applicable for the arguments (char).

Это связано с сужающее преобразование

If a value of broader (higher size) data type converted to a value of a narrower (lower size) data type which can result in loss of information, is called Narrowing conversion. This is not done implicitly by the JVM and requires explicit casting. For example double data type explicitly converted into integer

Поскольку символ является 16 bits в то время как байт является 8 bits Таким образом, вы должны явно привести как это:

char c='c'; 
byte b=(byte)c; 
go(b); 
0

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

0

int может поместиться в 32 бита, а символ - только 16 бит. Он неявно преобразуется в int без потери точности.

Однако байт может содержать только 8 бит, поэтому вам нужно будет явно указать, что вы хотите преобразовать его с помощью (byte)c. Однако большее значение char может быть уменьшено до меньшего значения.

Смежные вопросы