Apakah ada kesimpulan jenis otomatis di Jawa?


113

Apakah ada autotipe variabel di Java seperti yang Anda miliki di C ++?

Sebuah contoh:

for ( auto var : object_array)
    std::cout << var << std::endl;

for( auto var : object_array)
    var.do_something_that_only_this_particular_obj_can_do();

Saya tahu bahwa ada loop for yang disempurnakan di Java, tetapi apakah ada auto? Jika tidak, apakah ada cara untuk melakukan ini? Saya mengacu pada fitur baru di C ++ 11


1
Segala sesuatu kecuali tipe fundamental dapat ditetapkan ke variabel tipe Object, jadi untuk beberapa operasi, Anda dapat menggunakan di Objecttempat yang Anda inginkan auto.
Zyx 2000

1
tidak ada java yang tidak memiliki variabel seperti itu
Aleksei Bulgak

@ Zyx2000: Kemudian, itu akan menggunakan to_stringfungsi objek, dan bukan objek sebenarnya yang dimaksud, bukan?
Game Brainiac

2
@GamesBrainiac: Tidak, ini akan menggunakan versi yang diganti, jika ada.
Keppil

2
Istilah yang Anda cari bukanlah "otomatis", itu "jenis inferensi". Ada beberapa pertanyaan tentang jenis inferensi di Java, meskipun sebagian besar mengacu pada generik, jadi saya tidak yakin bagaimana menemukan duplikat ...

Jawaban:


49

Dijawab sebelum pertanyaan DIEDIT :

Tidak ada autotipe variabel di Java. Loop yang sama dapat dicapai sebagai:

for ( Object var : object_array)
  System.out.println(var);

Java memiliki variabel lokal, yang ruang lingkupnya berada di dalam blok tempat variabel tersebut telah ditentukan. Mirip dengan C dan C ++, tetapi tidak ada kata kunci otomatis atau daftar. Namun, kompilator Java tidak akan mengizinkan penggunaan variabel lokal yang tidak diinisialisasi secara eksplisit dan akan memberikan kesalahan kompilasi (tidak seperti C dan C ++ di mana kompilator biasanya hanya akan memberikan peringatan). Sumber: Wikipedia .

Tidak, tidak ada tipe-inferensi utama di Java seperti C ++. Ada RFE tetapi ditutup sebagai "Tidak akan diperbaiki", alasan yang diberikan adalah:

Manusia mendapat manfaat dari redundansi deklarasi tipe dalam dua cara. Pertama, tipe redundan berfungsi sebagai dokumentasi berharga - pembaca tidak perlu mencari deklarasi getMap () untuk mengetahui tipe apa yang dikembalikannya. Kedua, redundansi memungkinkan programmer untuk mendeklarasikan tipe yang diinginkan, dan dengan demikian mendapatkan keuntungan dari pemeriksaan silang yang dilakukan oleh compiler.


10
@GamesBrainiac Tidak, panggilan metode selalu polimorfik di Java. Namun, banyak hal lain (misalnya resolusi kelebihan beban, atau operasi apa pun yang tidak ditentukan Object) tidak dapat dilakukan seperti ini. Ini sebenarnya bukan jawaban yang bagus, ini hanya kebetulan berhasil karena contoh dalam pertanyaannya lemah.

10
Pertanyaan ini tentang tipe inferensi di C ++ 11, bukan tentang penggunaan lama autodi C dan pra-C ++ 11. Hasil edit Anda di luar topik.

4
"Bukan itu maksudku, setelah kamu mengetik cast ke Object, itu akan memberimu to_string Object" False. Benar-benar 100% salah.
Louis Wasserman

140
"Manusia mendapat manfaat dari redundansi." Itu benar. Setiap pagi saya bangun dan berpikir "bagaimana saya bisa membuat kode saya lebih mubazir?". Karena manfaatnya.
ahoffer

2
Selain itu, jawaban ini sudah usang karena varmerupakan kata kunci yang dipesan sejak Java 9.
6infinity8

69

Mungkin Java 10 memiliki apa yang Anda (dan saya) inginkan, melalui varkata kunci.

var list = new ArrayList<String>();  // infers ArrayList<String>
var stream = list.stream();          // infers Stream<String>

Dari Proposal Peningkatan JDK 286


Pembaruan: Ya , fitur itu berhasil masuk ke rilis Java 10!


6
Ya itu peningkatan, tetapi kata kunci itu hanya dapat bekerja dengan variabel lokal. Tidak sekuat inferensi tipe otomatis C ++
texasbruce

7
Minor-pick: varbukan kata kunci! Dari JLS : "var bukan kata kunci, melainkan pengenal dengan arti khusus sebagai jenis deklarasi variabel lokal". Jadi, tidak seperti kata kunci, tidak ada yang menghentikan Anda memanggil variabel atau metode "var".
Klitos Kyriacou

2
Poin bagus @litosriou. Namun, jika saya membayangkan untuk mengganti 'kata kunci' dengan 'pengenal' - atau bahkan 'pengenal dengan arti khusus sebagai jenis deklarasi variabel lokal' - jawabannya akan kurang jelas menurut saya. Tapi ya, varmemang tidak ada dalam daftar kata kunci.
sorrymissjackson

Ini bukan kata kunci hanya untuk kompatibilitas ke belakang. Selain fakta bahwa Anda dapat memiliki pengenal dengan nama ini, var memiliki peran sebagai kata kunci.
facetus

25

Java 7 memperkenalkan sintaks berlian

Box<Integer> integerBox = new Box<>(); // Java 7

Dibandingkan dengan java lama

Box<Integer> integerBox = new Box<Integer>(); // Before Java 7

Pembaca kritis akan melihat bahwa sintaks baru ini tidak membantu menulis loop for di pertanyaan asli. Sepertinya itu benar dan sepenuhnya disengaja. Lihat jawaban lain yang mengutip database bug Oracle.


4
Benar, tapi yang dia (dan saya) cari adalah sesuatu seperti auto integerBox = new Box<Integer>();HashMap<String, LinkedList<Operation, Set<Integer>>>
:,

1
Kekhawatiran itu persis seperti yang saya bahas setelah sampel kode. Kesimpulannya adalah Java tidak melakukan itu, dan itu sengaja.
Tarrasch

18

Di Java 8, Anda bisa menggunakan inferensi tipe lambda untuk menghindari deklarasi tipe. Analog dengan contoh penanya adalah:

object_array.forEach(var -> System.out.println(var)); 
object_array.forEach(var -> var.do_something_that_only_this_particular_obj_can_do());

keduanya juga dapat disederhanakan menggunakan referensi metode:

object_array.forEach(System.out::println); 
object_array.forEach(ObjectType::do_something_that_only_this_particular_obj_can_do);

8

Singkatnya, tidak ada tipe otomatis. Jika semua yang Anda lakukan adalah mencetak nilai, Anda bisa merujuk ke nilai sebagai Object.


atau menghitung hashCodes, atau mengumpulkan nama kelas, atau ... Anda mendapat ide;) Daftarnya pendek, meskipun. Lihat dokumen kelas Objek (komentar untuk pemula, saya yakin Anda mengetahuinya SimonC)
Alexander Malakhov

4

Ini bukan solusi Java murni, namun menambahkan pustaka bernama lombok akan memungkinkan keajaiban di bawah ini untuk mengkompilasi dan bekerja sangat mirip dengan autokata kunci di C ++

List<String> strList = Arrays.asList("foo", "bar", "baz");
for (val s: strList){
    System.out.println(s.length());
}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.