Java enums ยอดเยี่ยม ดังนั้นยาชื่อสามัญ แน่นอนว่าเราทุกคนรู้ถึงข้อ จำกัด ของอันหลังเนื่องจากการลบประเภท แต่มีสิ่งหนึ่งที่ฉันไม่เข้าใจว่าทำไมฉันไม่สามารถสร้าง enum เช่นนี้:
public enum MyEnum<T> {
LITERAL1<String>,
LITERAL2<Integer>,
LITERAL3<Object>;
}
พารามิเตอร์ประเภททั่วไป<T>
ในทางกลับกันนั้นจะมีประโยชน์ในสถานที่ต่าง ๆ ลองนึกภาพพารามิเตอร์ประเภททั่วไปกับวิธีการ:
public <T> T getValue(MyEnum<T> param);
หรือแม้แต่ในชั้นเรียน Enum เอง:
public T convert(Object o);
ตัวอย่างที่ชัดเจนยิ่งขึ้น # 1
เนื่องจากตัวอย่างด้านบนอาจดูเป็นนามธรรมเกินไปสำหรับบางคนนี่เป็นตัวอย่างในชีวิตจริงมากขึ้นว่าทำไมฉันถึงต้องการทำสิ่งนี้ ในตัวอย่างนี้ฉันต้องการใช้
- Enums เพราะจากนั้นฉันสามารถระบุชุดของคีย์คุณสมบัติที่ จำกัด ได้
- ยาสามัญเพราะฉันสามารถมีความปลอดภัยประเภทระดับวิธีการสำหรับการจัดเก็บคุณสมบัติ
public interface MyProperties {
public <T> void put(MyEnum<T> key, T value);
public <T> T get(MyEnum<T> key);
}
ตัวอย่างที่ชัดเจนยิ่งขึ้น # 2
ฉันมีการแจกแจงของชนิดข้อมูล:
public interface DataType<T> {}
public enum SQLDataType<T> implements DataType<T> {
TINYINT<Byte>,
SMALLINT<Short>,
INT<Integer>,
BIGINT<Long>,
CLOB<String>,
VARCHAR<String>,
...
}
แต่ละตัวอักษร enum จะเห็นได้ชัดว่ามีคุณสมบัติเพิ่มเติมตามประเภททั่วไป<T>
ในขณะที่ในเวลาเดียวกันเป็น enum (ไม่เปลี่ยนรูปซิงเกิลตันนับ ฯลฯ ฯลฯ )
คำถาม:
ไม่มีใครคิดเรื่องนี้บ้าง? นี่เป็นข้อ จำกัด ที่เกี่ยวข้องกับคอมไพเลอร์หรือไม่? พิจารณาข้อเท็จจริงที่ว่าคำหลัก " enum " นั้นถูกนำไปใช้เป็นน้ำตาล syntactic ซึ่งเป็นตัวแทนของรหัสที่สร้างขึ้นเพื่อ JVM ฉันไม่เข้าใจข้อ จำกัด นี้
ใครสามารถอธิบายสิ่งนี้ให้ฉันได้บ้าง ก่อนที่คุณจะตอบให้พิจารณาสิ่งนี้:
- ฉันรู้ว่าประเภททั่วไปถูกลบ :-)
- ฉันรู้ว่ามีวิธีแก้ปัญหาโดยใช้คลาสวัตถุ พวกเขากำลังแก้ไขปัญหา
- ประเภททั่วไปส่งผลให้เกิดประเภทคอมไพเลอร์สร้างมันได้ทุกที่ (เช่นเมื่อเรียกวิธีการแปลง ()
- ประเภททั่วไป <T> จะอยู่ใน enum ดังนั้นมันจึงผูกพันตามตัวอักษรของ enum แต่ละตัว ดังนั้นคอมไพเลอร์จะได้รู้ว่าประเภทใดที่จะนำไปใช้เมื่อเขียนบางอย่าง
String string = LITERAL1.convert(myObject); Integer integer = LITERAL2.convert(myObject);
- เช่นเดียวกับพารามิเตอร์ประเภททั่วไปใน
T getvalue()
วิธีการ คอมไพเลอร์สามารถใช้การหล่อประเภทเมื่อโทรString string = someClass.getValue(LITERAL1)
enum
เป็น "typesafe enum" สำนวนที่เราใช้ก่อนหน้า Java 1.5 ทันใดนั้นคุณสามารถกำหนดพารามิเตอร์สมาชิกของคุณได้ นั่นอาจเป็นสิ่งที่ฉันจะทำตอนนี้