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 int
ke 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.5
juga. Konversi float
ke int
akan kehilangan informasi; sama dengan mengonversi int
ke boolean
dan 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 if
tidak menerima tipe lain selain boolean
?
if
dapat 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 Boolean
dengan nilai false
).
- Atau bahkan: referensi objek lain yang bukan-
null
dan 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 null
untuk 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 boolean
tipe (karena tidak memiliki primitif), dan tidak memiliki Boolean
kelas 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, if
anggap falsey nilainya jika dan hanya jika salah satu false
atau nil
( null
Ruby). Yang lainnya benar. Jadi, 0
atau ""
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 null
di dalam setiap ekspresi secara otomatis membuatnya salah, apa pun yang terjadi. Jadi (null==null) = false
. Di Ruby (nil==nil) = true
,. Saat-saat bahagia.