หมายความว่าอาร์กิวเมนต์ชนิดสำหรับ enum ต้องสืบทอดมาจาก enum ซึ่งมีอาร์กิวเมนต์ชนิดเดียวกัน สิ่งนี้จะเกิดขึ้นได้อย่างไร? โดยทำให้อาร์กิวเมนต์ประเภทเป็นชนิดใหม่เอง ดังนั้นถ้าฉันได้รับ enum เรียกว่า StatusCode มันจะเทียบเท่ากับ:
public class StatusCode extends Enum<StatusCode>
ตอนนี้ถ้าคุณตรวจสอบข้อ จำกัด เราก็มีEnum<StatusCode>
เช่นE=StatusCode
นั้น ตรวจสอบกัน: E
ขยายEnum<StatusCode>
หรือไม่ ใช่ เราไม่เป็นไร
คุณอาจจะถามตัวเองว่าประเด็นนี้คืออะไร :) ก็หมายความว่า API สำหรับ Enum สามารถอ้างถึงตัวเองได้ - ตัวอย่างเช่นการพูดถึงEnum<E>
การดำเนินการComparable<E>
นั้น คลาสฐานสามารถทำการเปรียบเทียบ (ในกรณีของ enums) แต่สามารถตรวจสอบให้แน่ใจว่าจะเปรียบเทียบ enums ชนิดที่เหมาะสมกับแต่ละอื่น ๆ เท่านั้น (แก้ไข: ก็เกือบ - ดูการแก้ไขที่ด้านล่าง)
ฉันใช้สิ่งที่คล้ายกันใน C # พอร์ตของ ProtocolBuffers มี "ข้อความ" (ไม่เปลี่ยนรูป) และ "ผู้สร้าง" (ไม่แน่นอนที่ใช้ในการสร้างข้อความ) - และพวกเขามาเป็นคู่ประเภท อินเทอร์เฟซที่เกี่ยวข้องคือ:
public interface IBuilder<TMessage, TBuilder>
where TMessage : IMessage<TMessage, TBuilder>
where TBuilder : IBuilder<TMessage, TBuilder>
public interface IMessage<TMessage, TBuilder>
where TMessage : IMessage<TMessage, TBuilder>
where TBuilder : IBuilder<TMessage, TBuilder>
ซึ่งหมายความว่าจากข้อความที่คุณสามารถรับตัวสร้างที่เหมาะสม (เช่นการคัดลอกข้อความและเปลี่ยนบิต) และจากผู้สร้างคุณสามารถรับข้อความที่เหมาะสมเมื่อคุณสร้างมันเสร็จแล้ว มันเป็นงานที่ดีสำหรับผู้ใช้งาน API ที่ไม่จำเป็นต้องสนใจเรื่องนี้จริง ๆ - มันซับซ้อนอย่างน่ากลัวและใช้การวนซ้ำหลายครั้งเพื่อไปยังที่ที่มันอยู่
แก้ไข: โปรดทราบว่าสิ่งนี้จะไม่หยุดคุณจากการสร้างประเภทคี่ซึ่งใช้อาร์กิวเมนต์ประเภทที่ตัวเองก็โอเค แต่ที่ไม่ได้เป็นประเภทเดียวกัน มีวัตถุประสงค์เพื่อให้ผลประโยชน์ในกรณีที่เหมาะสมมากกว่าปกป้องคุณจากกรณีที่ไม่ถูกต้อง
ดังนั้นหากEnum
ไม่ได้จัดการ "พิเศษ" ใน Java คุณสามารถ (ตามที่ระบุไว้ในความคิดเห็น) สร้างประเภทต่อไปนี้:
public class First extends Enum<First> {}
public class Second extends Enum<First> {}
Second
จะใช้งานComparable<First>
มากกว่าComparable<Second>
... แต่First
จะดีกว่า