Ini baru-baru ini diminta di suatu tempat, jadi itu benar-benar gotcha. Mungkin masalahnya bergantung pada kesimpulan: Option[Integer](i).map(_.intValue)tampaknya paling idiomatis bagi saya, karena ia mengatakan apa yang dilakukannya. Juga, gunakan -Xlintuntuk melihat peringatan untuk val o!
som-snytt
Untuk menghindari pulang pergi tinju, `val x: Opsi [Int] = Opsi (i) .asInstanceOf [Opsi [Int]]` di mana Integerdisimpulkan.
som-snytt
7
Ini tampaknya terjadi karena Anda membuat Option, dan mengubahnya menjadi Intdalam satu langkah ( jawaban @ MarioGalic menjelaskan mengapa ini terjadi).
Perilaku yang benar-benar dipertanyakan adalah memperlakukan nullsebagai bilangan bulat. Ini mungkin adalah hangover dari Ctempat OK untuk menetapkan 0ke pointer. Tapi ini tidak berarti bahwa pointer yang dihasilkan adalah 0, jadi sangat cerdik untuk beralih di antara keduanya C.
Tim
Integerpaling mungkin berasal dari kode Java jadi 'jangan perlakukan null sebagai integer' bukan saran yang bisa ditindaklanjuti. Dan kami secara eksplisit memeriksa Integer ini untuk menggunakan nullability Option.apply. Jadi kami mendapatkan hasil yang tidak terduga tanpa melakukan operasi yang tidak aman secara eksplisit.
simpadjo
Intinya adalah bahwa Anda tidak dapat menyalahkan Scala untuk "perilaku yang dipertanyakan" ketika akar penyebabnya adalah Java. Saran yang dapat ditindaklanjuti adalah memiliki konversi eksplisit dari tipe Java ke tipe Scala yang setara daripada menggunakan konversi implisit. (Karena itu JavaConvertersdaripada JavaConversion)
Tim
1
Yah, saya bisa dan saya menyalahkan Scala karena tidak memancarkan kesalahan kompilasi / peringatan dalam kasus ini. Bahkan crash runtime akan lebih baik. Bahkan di perusahaan saya sendiri 2 pengembang dengan pengalaman 5+ tahun di Scala telah mengatasi masalah ini.
simpadjo
1
@Tim Akan sangat mudah untuk mendapatkan crash runtime, hanya dengan menelepon theInteger.intValue(). Menghindari kecelakaan itu adalah apa yang menyebabkan biaya pemeriksaan runtime tambahan. Dalam versi Scala yang lebih lama, konversi ini memang menghasilkan NPE; itu dilaporkan sebagai bug, dan diperbaiki dengan perilaku saat ini. Saya bukan ahli Scala, tetapi saya menggali scala-dev # 355 dan scala # 5176 sebagai konteks sejarah.
Jawaban:
Anda mencampur
Int
danjava.lang.Integer
sebagainyasecara implisit mengkonversi ke
yang menjadi
jadi
Jika Anda ingin bekerja dengannya
java.lang.Integer
, maka tulislahsumber
Option[Integer](i).map(_.intValue)
tampaknya paling idiomatis bagi saya, karena ia mengatakan apa yang dilakukannya. Juga, gunakan-Xlint
untuk melihat peringatan untukval o
!Integer
disimpulkan.Ini tampaknya terjadi karena Anda membuat
Option
, dan mengubahnya menjadiInt
dalam satu langkah ( jawaban @ MarioGalic menjelaskan mengapa ini terjadi).Ini melakukan apa yang Anda inginkan:
sumber
_.intValue
. Saya kira itu hanya menyimpan panggilan konversi.Menghadapi masalah yang sama sebelumnya. Perilaku yang dipertanyakan ini diketahui oleh tim Scala. Tampaknya mengubahnya merusak sesuatu di tempat lain. Lihat https://github.com/scala/bug/issues/11236 dan https://github.com/scala/scala/pull/5176 .
sumber
null
sebagai bilangan bulat. Ini mungkin adalah hangover dariC
tempat OK untuk menetapkan0
ke pointer. Tapi ini tidak berarti bahwa pointer yang dihasilkan adalah0
, jadi sangat cerdik untuk beralih di antara keduanyaC
.Integer
paling mungkin berasal dari kode Java jadi 'jangan perlakukan null sebagai integer' bukan saran yang bisa ditindaklanjuti. Dan kami secara eksplisit memeriksa Integer ini untuk menggunakan nullabilityOption.apply
. Jadi kami mendapatkan hasil yang tidak terduga tanpa melakukan operasi yang tidak aman secara eksplisit.JavaConverters
daripadaJavaConversion
)theInteger.intValue()
. Menghindari kecelakaan itu adalah apa yang menyebabkan biaya pemeriksaan runtime tambahan. Dalam versi Scala yang lebih lama, konversi ini memang menghasilkan NPE; itu dilaporkan sebagai bug, dan diperbaiki dengan perilaku saat ini. Saya bukan ahli Scala, tetapi saya menggali scala-dev # 355 dan scala # 5176 sebagai konteks sejarah.