Bu, enum için tür bağımsız değişkeninin, kendisinin aynı tür bağımsız değişkenine sahip bir enumdan türetmesi gerektiği anlamına gelir. Bu nasıl olabilir? Type bağımsız değişkenini yeni türün kendisi yaparak. Yani StatusCode adlı bir numaralandırma varsa, buna eşdeğer olurdu:
public class StatusCode extends Enum<StatusCode>
Şimdi kısıtlamaları kontrol ederseniz, var Enum<StatusCode>
- yani E=StatusCode
. Kontrol edelim: E
uzanıyor Enum<StatusCode>
mu? Evet! Biz iyiyiz.
Kendinize bunun amacının ne olduğunu soruyor olabilirsiniz :) Eh, bu, Enum için API'nin kendisine başvurabileceği anlamına gelir - örneğin, bunu Enum<E>
uyguladığını söyleyebilmek Comparable<E>
. Temel sınıf karşılaştırmaları (numaralandırmalar durumunda) yapabilir, ancak yalnızca doğru türdeki numaralandırmaları birbirleriyle karşılaştırdığından emin olabilir. (DÜZENLEME: Neredeyse - alttaki düzenlemeye bakın.)
ProtocolBuffers benim C # port benzer bir şey kullandım. "Mesajlar" (değişmez) ve "yapıcılar" (değişebilir, bir mesaj oluşturmak için kullanılır) vardır ve bunlar bir tür çift olarak gelir. İlgili arayüzler:
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>
Bu, bir mesajdan uygun bir oluşturucu alabileceğiniz (örneğin bir mesajın kopyasını alıp bazı bitleri değiştirmek için) ve bir oluşturucudan oluşturmayı bitirdiğinizde uygun bir mesaj alabileceğiniz anlamına gelir. API kullanıcılarının iyi bir iş olmasına rağmen aslında bunu önemsemelerine gerek yok - korkunç derecede karmaşık ve bulunduğu yere ulaşmak için birkaç iterasyon aldı.
DÜZENLEME: Bunun, kendisinin iyi olduğu, ancak aynı tür olmayan bir tür bağımsız değişkeni kullanan tek türler oluşturmanızı engellemediğini unutmayın. Amaç, sizi yanlış davadan korumak yerine doğru davada fayda sağlamaktır .
Dolayısıyla Enum
, Java'da "özel olarak" ele alınmadıysa, (yorumlarda belirtildiği gibi) aşağıdaki türleri oluşturabilirsiniz:
public class First extends Enum<First> {}
public class Second extends Enum<First> {}
Second
uygulamak Comparable<First>
yerine Comparable<Second>
... ama First
kendisi iyi olurdu.