ประเภทที่เข้ากันไม่ได้: int ไม่สามารถแปลงเป็นบูลีนได้
ฉันสนใจว่าทำไม C ถึงยอมและไม่จาวา ดังนั้นฉันสนใจระบบพิมพ์ภาษาโดยเฉพาะความแข็งแกร่งของมัน
คำถามของคุณมีสองส่วน:
ทำไม Java ไม่แปลงint
เป็นboolean
?
การทำเช่นนี้จะทำให้ Java มีความตั้งใจชัดเจนที่สุดเท่าที่จะเป็นไปได้ มันคงที่ "อยู่ในใบหน้าของคุณ" ด้วยระบบการพิมพ์ สิ่งที่นำแสดงโดยอัตโนมัติในภาษาอื่นไม่ได้เป็นเช่นนั้นใน Java คุณต้องเขียนint a=(int)0.5
เช่นกัน การแปลงfloat
เป็นint
ข้อมูลสูญหาย เหมือนกับการแปลงint
เป็นboolean
และจะทำให้เกิดข้อผิดพลาดได้ง่าย นอกจากนี้พวกเขาจะต้องระบุชุดค่าผสมจำนวนมาก แน่นอนสิ่งเหล่านี้ดูเหมือนจะชัดเจน แต่พวกเขาตั้งใจที่จะทำผิดในด้านของความระมัดระวัง
โอ้และเมื่อเปรียบเทียบกับภาษาอื่น ๆ แล้ว Java นั้นมีความแม่นยำอย่างมากในสเปคของมันเนื่องจาก bytecode ไม่ได้เป็นเพียงรายละเอียดการติดตั้งภายในเท่านั้น พวกเขาจะต้องระบุการโต้ตอบใด ๆ และทั้งหมดอย่างแม่นยำ กิจการขนาดใหญ่
ทำไมif
ไม่ยอมรับประเภทอื่นที่ไม่ใช่boolean
?
if
boolean
จะสมบูรณ์ดีจะหมายถึงการอนุญาตให้มีชนิดอื่นที่ไม่ใช่ อาจมีคำจำกัดความที่ระบุว่าสิ่งต่อไปนี้เทียบเท่า:
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
. เวลาแห่งความสุข.