ประเภทที่เข้ากันไม่ได้: int ไม่สามารถแปลงเป็นบูลีนได้
ฉันสนใจว่าทำไม C ถึงยอมและไม่จาวา ดังนั้นฉันสนใจระบบพิมพ์ภาษาโดยเฉพาะความแข็งแกร่งของมัน
คำถามของคุณมีสองส่วน:
ทำไม Java ไม่แปลงintเป็นboolean?
การทำเช่นนี้จะทำให้ Java มีความตั้งใจชัดเจนที่สุดเท่าที่จะเป็นไปได้ มันคงที่ "อยู่ในใบหน้าของคุณ" ด้วยระบบการพิมพ์ สิ่งที่นำแสดงโดยอัตโนมัติในภาษาอื่นไม่ได้เป็นเช่นนั้นใน Java คุณต้องเขียนint a=(int)0.5เช่นกัน การแปลงfloatเป็นintข้อมูลสูญหาย เหมือนกับการแปลงintเป็นbooleanและจะทำให้เกิดข้อผิดพลาดได้ง่าย นอกจากนี้พวกเขาจะต้องระบุชุดค่าผสมจำนวนมาก แน่นอนสิ่งเหล่านี้ดูเหมือนจะชัดเจน แต่พวกเขาตั้งใจที่จะทำผิดในด้านของความระมัดระวัง
โอ้และเมื่อเปรียบเทียบกับภาษาอื่น ๆ แล้ว Java นั้นมีความแม่นยำอย่างมากในสเปคของมันเนื่องจาก bytecode ไม่ได้เป็นเพียงรายละเอียดการติดตั้งภายในเท่านั้น พวกเขาจะต้องระบุการโต้ตอบใด ๆ และทั้งหมดอย่างแม่นยำ กิจการขนาดใหญ่
ทำไมifไม่ยอมรับประเภทอื่นที่ไม่ใช่boolean?
ifbooleanจะสมบูรณ์ดีจะหมายถึงการอนุญาตให้มีชนิดอื่นที่ไม่ใช่ อาจมีคำจำกัดความที่ระบุว่าสิ่งต่อไปนี้เทียบเท่า:
true
int != 0
String กับ .length>0
- การอ้างอิงวัตถุอื่นใด ๆ ที่ไม่ใช่ -
null(ไม่ใช่Booleanค่าที่มีfalse)
- หรือแม้กระทั่ง: ใด ๆ อ้างอิงวัตถุอื่น ๆ ที่เป็นไม่
nullและมีวิธีการObject.check_if(การประดิษฐ์คิดค้นโดยฉันเพียงแค่สำหรับโอกาสนี้) trueผลตอบแทน
พวกเขาไม่ได้; ไม่มีความต้องการที่แท้จริงและพวกเขาต้องการให้มีประสิทธิภาพคงที่โปร่งใสง่ายต่อการอ่านและอื่น ๆ เท่าที่จะทำได้ ไม่มีคุณสมบัติโดยนัย นอกจากนี้การใช้งานจะค่อนข้างซับซ้อนฉันแน่ใจว่าต้องทดสอบแต่ละค่าสำหรับกรณีที่เป็นไปได้ทั้งหมดดังนั้นประสิทธิภาพอาจมีปัจจัยเล็ก ๆ น้อย ๆ เช่นกัน (Java เคยเป็นคนพูดเหลวไหลในคอมพิวเตอร์ของวันนั้นจำไว้ว่ามี ไม่มีคอมไพเลอร์ JIT ที่มีการเปิดตัวครั้งแรกอย่างน้อยก็ไม่ได้ใช้กับคอมพิวเตอร์ที่ฉันใช้)
เหตุผลที่ลึก
เหตุผลที่ลึกกว่านั้นอาจเป็นความจริงที่ว่า Java มีชนิดดั้งเดิมของมันดังนั้นระบบชนิดของมันจึงขาดระหว่างวัตถุและดั้งเดิม บางทีถ้าพวกเขาหลีกเลี่ยงสิ่งเหล่านั้นสิ่งต่าง ๆ ก็จะกลับกลายเป็นอีกทางหนึ่ง ด้วยกฎที่ให้ไว้ในส่วนก่อนหน้าพวกเขาจะต้องกำหนดความจริงของดั้งเดิมทุก ๆอย่างชัดเจน (ตั้งแต่ดั้งเดิมไม่แบ่งปันซูเปอร์คลาสและไม่มีกำหนดชัดเจนnullสำหรับดั้งเดิม) นี่จะกลายเป็นฝันร้ายอย่างรวดเร็ว
ภาพ
และในที่สุดอาจเป็นเพียงความชอบของนักออกแบบภาษา แต่ละภาษาดูเหมือนจะหมุนในแบบของตัวเองที่นั่น ...
ตัวอย่างเช่น Ruby ไม่มีประเภทดั้งเดิม ทุกอย่างแท้จริงทุกอย่างเป็นวัตถุ พวกเขามีเวลาง่ายมากที่จะทำให้แน่ใจว่าวัตถุทุกชิ้นมีวิธีการบางอย่าง
ทับทิมมองหาความจริงในวัตถุทุกประเภทที่คุณสามารถโยนได้ ที่น่าสนใจก็ยังไม่มีbooleanประเภท (เพราะไม่มีพื้นฐาน) และมันก็ไม่มีBooleanคลาส ถ้าคุณถามว่าระดับค่าที่trueมี (คล่องแคล่วสามารถใช้ได้กับtrue.class) TrueClassคุณจะได้รับ ชั้นเรียนนั้นมีวิธีการจริงๆนั่นคือตัวดำเนินการ 4 ตัวสำหรับ booleans ( | & ^ ==) ที่นี่ifพิจารณาค่าของมันปลอมถ้าหากเป็นอย่างใดอย่างหนึ่งfalseหรือnil( nullของ Ruby) ทุกสิ่งทุกอย่างเป็นเรื่องจริง ดังนั้น0หรือ""เป็นจริงทั้งคู่
มันคงเป็นเรื่องไม่สำคัญสำหรับพวกเขาที่จะสร้างวิธีการObject#truthy?ที่สามารถนำไปใช้กับชั้นเรียนใด ๆ และคืนความจริงส่วนบุคคล ตัวอย่างเช่นString#truthy?อาจมีการใช้งานเป็นจริงสำหรับสตริงที่ไม่ว่างเปล่าหรืออะไรก็ตาม พวกเขาไม่ได้แม้ว่า Ruby จะเป็นสิ่งที่ตรงกันข้ามของ Java ในแผนกส่วนใหญ่ (การพิมพ์เป็ดแบบไดนามิกด้วยมิกซ์อิน, การเปิดคลาสอีกครั้งและทั้งหมดนั้น)
ซึ่งอาจจะแปลกใจสำหรับโปรแกรมเมอร์ Perl ที่เคย$value <> 0 || length($value)>0 || defined($value)เป็นจริง และอื่น ๆ
ป้อน SQL ด้วยแบบแผนที่ nullอยู่ภายในนิพจน์ใด ๆ ทำให้เป็นเท็จโดยอัตโนมัติไม่ว่าอะไรก็ตาม (null==null) = falseดังนั้น ในทับทิม, (nil==nil) = true. เวลาแห่งความสุข.