คำถามติดแท็ก type-erasure

11
ฉันจะลบประเภทใน Scala ได้อย่างไร หรือเหตุใดฉันจึงไม่สามารถรับพารามิเตอร์ type ของคอลเล็กชันของฉันได้
มันเป็นความจริงที่น่าเศร้าของชีวิตใน Scala ที่ว่าถ้าคุณยกตัวอย่าง List [Int] คุณสามารถตรวจสอบว่าอินสแตนซ์ของคุณเป็น List และคุณสามารถตรวจสอบได้ว่าองค์ประกอบใด ๆ ของมันเป็น Int แต่ไม่ใช่ว่าเป็น List Int] ตามที่สามารถตรวจสอบได้ง่าย: scala> List(1,2,3) match { | case l : List[String] => println("A list of strings?!") | case _ => println("Ok") | } warning: there were unchecked warnings; re-run with -unchecked for details A list of strings?! …

17
อะไรคือสาเหตุที่ฉันไม่สามารถสร้างประเภทอาร์เรย์ทั่วไปใน Java ได้
เหตุผลที่ Java ไม่อนุญาตให้เราทำอะไร private T[] elements = new T[initialCapacity]; ฉันสามารถเข้าใจ. NET ไม่อนุญาตให้เราทำเช่นนั้นใน. NET คุณมีประเภทค่าที่เวลาทำงานสามารถมีขนาดแตกต่างกัน แต่ใน Java T ทุกชนิดจะเป็นการอ้างอิงวัตถุจึงมีขนาดเดียวกัน ( ช่วยแก้ให้ด้วยนะถ้าฉันผิด). เหตุผลคืออะไร

7
Java generics ประเภทลบ: เมื่อใดและจะเกิดอะไรขึ้น
ฉันอ่านเกี่ยวกับการลบประเภทของ Java บนเว็บไซต์ของออราเคิล การลบประเภทเกิดขึ้นเมื่อใด ในเวลารวบรวมหรือรันไทม์? เมื่อชั้นเรียนถูกโหลด? เมื่อชั้นเรียนถูกยกตัวอย่าง? มีไซต์จำนวนมาก (รวมถึงบทแนะนำอย่างเป็นทางการที่กล่าวถึงข้างต้น) พูดว่าการลบประเภทเกิดขึ้นในเวลารวบรวม หากข้อมูลประเภทจะถูกลบออกอย่างสมบูรณ์ในเวลารวบรวมวิธีการตรวจสอบความเข้ากันได้ของประเภท JDK เมื่อวิธีการใช้ข้อมูลทั่วไปจะถูกเรียกโดยไม่มีข้อมูลประเภทหรือข้อมูลประเภทที่ไม่ถูกต้อง? ลองพิจารณาตัวอย่างต่อไปนี้: ระดับ Say มีวิธีการที่A empty(Box<? extends Number> b)เรารวบรวมและรับไฟล์ชั้นเรียนA.javaA.class public class A { public static void empty(Box<? extends Number> b) {} } public class Box<T> {} ตอนนี้เราสร้างชั้นอื่นBซึ่งเรียกวิธีการที่emptyมีข้อโต้แย้งที่ไม่แปร empty(new Box())(ชนิดดิบ): ถ้าเรารวบรวมB.javaกับA.classใน classpath ที่ javac เป็นพอสมาร์ทที่จะยกระดับการเตือน ดังนั้นจึงA.class มีข้อมูลประเภทที่เก็บอยู่ในนั้น public class …

6
พิมพ์เทคนิคการลบ
(ด้วยการลบประเภทฉันหมายถึงการซ่อนข้อมูลประเภทบางส่วนหรือทั้งหมดเกี่ยวกับคลาสเช่นBoost อะไรก็ได้) ฉันต้องการใช้เทคนิคการลบประเภทในขณะเดียวกันก็แบ่งปันสิ่งเหล่านั้นซึ่งฉันรู้จัก ความหวังของฉันคือการได้พบกับเทคนิคบ้าๆที่ใครบางคนนึกถึงในชั่วโมงที่มืดมนที่สุดของเขา / เธอ :) แนวทางแรกและชัดเจนที่สุดและใช้กันทั่วไปที่ฉันรู้คือฟังก์ชันเสมือนจริง เพียงซ่อนการนำคลาสของคุณไปใช้ภายในลำดับชั้นคลาสที่ใช้อินเทอร์เฟซ ไลบรารี Boost จำนวนมากทำสิ่งนี้เช่นBoost สิ่งใดก็ตามที่ทำสิ่งนี้เพื่อซ่อนประเภทและBoostของคุณShared_ptrทำสิ่งนี้เพื่อซ่อนกลไกการจัดสรร (de) จากนั้นมีตัวเลือกที่มีฟังก์ชันพอยน์เตอร์ไปยังฟังก์ชันเทมเพลตในขณะที่ถือวัตถุจริงไว้ในvoid*ตัวชี้เช่นBoost ฟังก์ชันจะซ่อนประเภทจริงของ functor ตัวอย่างการใช้งานสามารถพบได้ในตอนท้ายของคำถาม ดังนั้นสำหรับคำถามที่แท้จริงของฉัน: คุณรู้เทคนิคการลบประเภทใดอีกบ้าง หากเป็นไปได้โปรดระบุรหัสตัวอย่างกรณีการใช้งานประสบการณ์ของคุณกับพวกเขาและลิงก์สำหรับการอ่านเพิ่มเติมหากเป็นไปได้ แก้ไข (เนื่องจากฉันไม่แน่ใจว่าจะเพิ่มสิ่งนี้เป็นคำตอบหรือเพียงแค่แก้ไขคำถามฉันจะทำแบบที่ปลอดภัยกว่านี้) อีกหนึ่งเทคนิคที่ดีในการซ่อนประเภทที่แท้จริงของบางสิ่งโดยไม่มีฟังก์ชันเสมือนจริงหรือการvoid*เล่นซอคือ GMan คนหนึ่งมีพนักงานที่นี่โดยมีความเกี่ยวข้องกับคำถามของฉันว่ามันทำงานอย่างไร รหัสตัวอย่าง: #include <iostream> #include <string> // NOTE: The class name indicates the underlying type erasure technique // this behaves like the Boost.Any type w.r.t. …
136 c++  type-erasure 

11
การลบประเภทของ Java มีประโยชน์อย่างไร?
วันนี้ฉันอ่านทวีตที่กล่าวว่า: เป็นเรื่องตลกเมื่อผู้ใช้ Java บ่นเกี่ยวกับการลบประเภทซึ่งเป็นสิ่งเดียวที่ Java มีสิทธิ์ในขณะที่เพิกเฉยต่อสิ่งที่ผิดพลาดทั้งหมด ดังนั้นคำถามของฉันคือ: มีประโยชน์จากการลบประเภทของ Java หรือไม่? รูปแบบทางเทคนิคหรือการเขียนโปรแกรมมีประโยชน์อะไรบ้าง (อาจ) นำเสนอนอกเหนือจากการกำหนดลักษณะการใช้งาน JVM สำหรับความเข้ากันได้แบบย้อนกลับและประสิทธิภาพรันไทม์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.