ส่งผ่านวิธี Java null ไปยัง non-nullable จาก Kotlin

สมมติว่ามีไลบรารี Java ที่ประกาศ @NonNullApi แต่จริงๆ แล้ววิธีการบางอย่างอาจใช้พารามิเตอร์ null

มีวิธีการเพิกเฉยต่อข้อกำหนดที่ไม่เป็นโมฆะและผ่าน null จาก Kotlin หรือไม่

UPD จำเป็นต้องชี้แจง: วิธีการถูกประกาศว่าไม่เป็นโมฆะโดยไลบรารีของบุคคลที่สาม ไม่มีทางที่จะเปลี่ยนโค้ดได้ เป้าหมายคือการทำลายข้อจำกัดจากฝ่ายการโทร

วิธีที่ชัดเจนคือการใช้ Reflection แต่บางที Kotlin อาจมีไวยากรณ์สำหรับสิ่งนั้นใช่ไหม


person Adamovskiy    schedule 18.11.2019    source แหล่งที่มา
comment
ใส่คำอธิบายประกอบพารามิเตอร์ด้วย @Nullable   -  person killjoy    schedule 18.11.2019
comment
คุณหมายถึงการประกาศพารามิเตอร์ใช่หรือไม่? นี่คือไลบรารีของบุคคลที่สาม ไม่สามารถเปลี่ยนแปลงได้   -  person Adamovskiy    schedule 18.11.2019
comment
มันคือห้องสมุดอะไร? คุณต้องการส่งผ่านค่า null ด้วยวิธีใด   -  person killjoy    schedule 18.11.2019
comment
หากเป็นข้อบกพร่องในไลบรารีที่ทำให้พารามิเตอร์นี้ไม่มีค่าว่าง คุณสามารถเขียนวิธี Java ที่ยอมรับค่า null และส่งผ่านไปยังไลบรารี และเรียกวิธี Java นี้จาก Kotlin   -  person JB Nizet    schedule 18.11.2019


คำตอบ (2)


ดังที่คำตอบอื่น ๆ ชี้ให้เห็น เป็นการดีกว่าที่จะไม่เอาชนะสัญญาความเป็นโมฆะของฟังก์ชัน Java ที่แสดงด้วยคำอธิบายประกอบที่เป็นโมฆะ

แต่ถ้าคุณเชื่อจริงๆ ว่าคำอธิบายประกอบเหล่านั้นอยู่ที่นั่นโดยไม่ได้ตั้งใจ คุณสามารถใช้วิธีแก้ปัญหาชั่วคราวต่อไปนี้:

  • ประกาศฟังก์ชันคงที่ของตัวช่วยในคลาสยูทิลิตี้ Java ข้างโค้ด Kotlin ของคุณ ฟังก์ชันนี้ไม่มีคำอธิบายประกอบ NonNull ในพารามิเตอร์ที่คุณต้องส่งผ่าน null และเพียงส่งต่อไปยังเมธอดที่ต้องการ คอมไพเลอร์ Java ไม่ได้ป้องกันการเรียกใช้เมธอดนั้นแม้ว่าคำอธิบายประกอบที่เป็นโมฆะจะไม่ตรงกันก็ตาม
  • นำเข้าฟังก์ชันตัวช่วยแบบคงที่นั้นไปยัง Kotlin และเรียกจากที่นั่น
person Ilya    schedule 18.11.2019
comment
ขอบคุณ! แน่นอนว่าแฮ็กนี้ไม่ควรใช้กับ API ที่ออกแบบมาอย่างดี เป็นเรื่องน่าเศร้าที่สิ่งง่ายๆ เช่นนี้ต้องใช้โค้ดมากมาย - person Adamovskiy; 18.11.2019
comment
@AlexeyAdamovskiy ดี ... ฉันคิดว่าวิธีนี้ดีกว่า (โค้ดมากมาย) จากนั้นวิธีอื่น (มีการแก้ไขอย่างง่ายสำหรับสิ่งนี้) ... ผู้ออกแบบห้องสมุดไม่ต้องการยอมรับ null-values ​​ที่นี่ ... ว่า ฟังก์ชั่นใช้งานได้กับ null-values ​​อาจเป็นเรื่องบังเอิญ... และหากเป็นข้อผิดพลาดและควรยอมรับ null คุณควรติดต่อผู้ออกแบบห้องสมุดคนนั้นดีกว่า... - person Roland; 19.11.2019

ไม่ใช่คำตอบที่ชัดเจน: อย่าทำอย่างนั้น!

เอกสาร API นั้นระบุว่า: อย่าส่ง null ด้วยวิธีนี้

แม้ว่าการใช้งานในวันนี้จะไม่ทำให้คุณเสียสิทธิ์ในการส่งผ่าน null ใครบอกว่านั่นไม่ใช่จุดบกพร่อง และจะไม่ได้รับการแก้ไขในไลบรารีเวอร์ชันที่กำลังจะมีขึ้นบางเวอร์ชัน

กล่าวอีกนัยหนึ่ง: เขียนโค้ดของคุณให้ตรงกับ API ที่ระบุ

เมื่อการใช้งานไลบรารีมีความใจกว้างมากกว่าข้อกำหนด API ให้ปฏิบัติตามกฎที่เข้มงวดกว่า คุณควรพิจารณาเขียนรายงานสำหรับห้องสมุดนั้นด้วย

person GhostCat    schedule 18.11.2019