tipe tidak kompatibel: int tidak dapat dikonversi ke boolean
Saya tertarik pada mengapa C mengizinkannya dan java tidak. Oleh karena itu, saya tertarik pada sistem tipe bahasa, khususnya kekuatannya.
Ada dua bagian untuk pertanyaan Anda:
Mengapa Java tidak mengkonversi intke boolean?
Ini bermuara pada Jawa yang dimaksudkan untuk menjadi sejelas mungkin. Ini sangat statis, sangat "di wajahmu" dengan sistem tipenya. Hal-hal yang secara otomatis diketik-ketik dalam bahasa lain tidak demikian, di Jawa. Anda harus menulis int a=(int)0.5juga. Konversi floatke intakan kehilangan informasi; sama dengan mengonversi intke booleandan karenanya akan rawan kesalahan. Juga, mereka harus menentukan banyak kombinasi. Tentu, hal-hal ini tampaknya jelas, tetapi mereka bermaksud berbuat salah di sisi kehati-hatian.
Oh, dan dibandingkan dengan bahasa lain, Java sangat tepat dalam spesifikasinya, karena bytecode bukan hanya detail implementasi internal. Mereka harus menentukan interaksi apa saja dan semua, tepatnya. Usaha besar.
Mengapa iftidak menerima tipe lain selain boolean?
ifdapat dengan sempurna didefinisikan untuk memungkinkan jenis selain boolean. Itu bisa memiliki definisi yang mengatakan yang berikut ini setara:
true
int != 0
String dengan .length>0
- Referensi objek lain yang bukan
null(dan bukan Booleandengan nilai false).
- Atau bahkan: referensi objek lain yang bukan-
nulldan metode yang Object.check_if(ditemukan oleh saya hanya untuk kesempatan ini) kembali true.
Mereka tidak; tidak ada kebutuhan nyata, dan mereka ingin memilikinya sekuat, statis, transparan, mudah dibaca dll. mungkin. Tidak ada fitur implisit. Juga, implementasinya akan sangat kompleks, saya yakin, harus menguji setiap nilai untuk semua kasus yang mungkin, jadi kinerja mungkin memainkan faktor kecil juga (Java dulu sloooow di komputer pada hari itu; ingat ada tidak ada kompiler JIT dengan rilis pertama, setidaknya tidak pada komputer yang saya gunakan saat itu).
Alasan yang lebih dalam
Alasan yang lebih dalam adalah fakta bahwa Jawa memiliki tipe primitifnya, karenanya sistem tipenya terbelah antara objek dan primitif. Mungkin, jika mereka menghindari itu, segalanya akan berubah dengan cara lain. Dengan aturan yang diberikan pada bagian sebelumnya, mereka harus mendefinisikan kebenaran dari setiap primitif secara eksplisit (karena primitif tidak berbagi kelas super, dan tidak ada yang didefinisikan dengan baik nulluntuk primitif). Ini akan berubah menjadi mimpi buruk, dengan cepat.
Pandangan
Yah, dan pada akhirnya, mungkin itu hanya preferensi para perancang bahasa. Setiap bahasa tampaknya berputar sendiri di sana ...
Misalnya, Ruby tidak memiliki tipe primitif. Semuanya, secara harfiah segalanya, adalah objek. Mereka memiliki waktu yang sangat mudah untuk memastikan bahwa setiap objek memiliki metode tertentu.
Ruby memang mencari kebenaran pada semua jenis objek yang bisa Anda lemparkan padanya. Yang cukup menarik, masih tidak memiliki booleantipe (karena tidak memiliki primitif), dan tidak memiliki Booleankelas juga. Jika Anda bertanya pada kelas berapa nilainya true(tersedia dengan mudah true.class), Anda dapatkan TrueClass. Kelas itu sebenarnya memiliki metode, yaitu 4 operator untuk boolean ( | & ^ ==). Di sini, ifanggap falsey nilainya jika dan hanya jika salah satu falseatau nil( nullRuby). Yang lainnya benar. Jadi, 0atau ""keduanya benar.
Sepele bagi mereka untuk menciptakan metode Object#truthy?yang dapat diterapkan untuk kelas apa pun dan mengembalikan kebenaran individu. Misalnya, String#truthy?bisa diterapkan untuk string yang tidak kosong, atau yang lainnya. Mereka tidak, meskipun Ruby adalah antitesis Jawa di sebagian besar departemen (mengetik bebek dinamis dengan mixin, membuka kembali kelas dan semua itu).
Yang mungkin mengejutkan bagi seorang programmer Perl yang terbiasa $value <> 0 || length($value)>0 || defined($value)menjadi kebenaran. Dan seterusnya.
Masukkan SQL dengan konvensi bahwa nulldi dalam setiap ekspresi secara otomatis membuatnya salah, apa pun yang terjadi. Jadi (null==null) = false. Di Ruby (nil==nil) = true,. Saat-saat bahagia.