Di JLS 5.2, yang berhubungan dengan penyempitan konversi, dikatakan:

Selain itu, jika ekspresi adalah ekspresi konstan (§15.28) bertipe byte, short, char, atau int:

Konversi primitif yang menyempit dapat digunakan jika tipe variabel adalah byte, short, atau char, dan nilai ekspresi konstan dapat direpresentasikan dalam tipe variabel. ...

"Dengan kata lain, untuk nilai seperti bilangan bulat yang tidak panjang, Anda dapat secara implisit mempersempitnya jika nilai yang Anda persempit adalah konstanta yang sesuai dengan tipe yang Anda tentukan."

  byte a = 1; // declare a byte
  a = a*2; //  you will get error here

Dalam pernyataan pertama, integer 1 yang berada dalam kisaran byte ditugaskan ke byte a dan ada casting implisit.

Dalam pernyataan kedua, byte a dari nilai 1 dikalikan dengan bilangan bulat 2. Karena aturan aritmatika di Java, byte a dari nilai 1 diubah menjadi bilangan bulat bernilai 1. Hasil perkalian kedua bilangan bulat ini (1*2) adalah bilangan bulat 2.

Mengapa tidak ada konversi implisit dalam pernyataan kedua yang menghasilkan kesalahan?

Main.java:14: error: incompatible types: possible lossy conversion from int to byte
  a = a*2; 
0
csguy 15 Maret 2019, 05:28

1 menjawab

Jawaban Terbaik

Karena, dalam contoh Anda, a*2 bukan rel ekspresi konstan.

Ini akan menjadi ekspresi konstan jika a merujuk ke variabel konstan:

final byte a = 1;
byte b = a * 2; // compiles fine
2
Robby Cornelissen 15 Maret 2019, 02:36