Java numaralandırmaları harika. Jenerikler de öyle. Elbette hepimiz tür silme nedeniyle ikincisinin sınırlamalarını biliyoruz. Ama anlamadığım bir şey var, Neden böyle bir sıralama oluşturamıyorum:
public enum MyEnum<T> {
LITERAL1<String>,
LITERAL2<Integer>,
LITERAL3<Object>;
}
Bu genel tip parametresi <T>
daha sonra çeşitli yerlerde yararlı olabilir. Bir yöntem için genel bir tür parametresi düşünün:
public <T> T getValue(MyEnum<T> param);
Veya enum sınıfının kendisinde bile:
public T convert(Object o);
Daha somut örnek 1
Yukarıdaki örnek bazıları için fazla soyut görünebileceğinden, işte bunu neden yapmak istediğime dair daha gerçek hayattan bir örnek. Bu örnekte kullanmak istiyorum
- Numaralandırmalar, çünkü o zaman sonlu bir özellik anahtarı kümesini numaralandırabilirim
- Jenerikler, çünkü o zaman özellikleri depolamak için yöntem düzeyinde tür güvenliğine sahip olabilirim
public interface MyProperties {
public <T> void put(MyEnum<T> key, T value);
public <T> T get(MyEnum<T> key);
}
Daha somut örnek 2
Veri türleri numaram var:
public interface DataType<T> {}
public enum SQLDataType<T> implements DataType<T> {
TINYINT<Byte>,
SMALLINT<Short>,
INT<Integer>,
BIGINT<Long>,
CLOB<String>,
VARCHAR<String>,
...
}
Her bir enum değişmezi, açık bir şekilde genel türe göre ek özelliklere sahip olacaktır. <T>
sahipken, aynı zamanda bir enum (değişmez, tekli, numaralandırılabilir vb.)
Soru:
Bunu kimse düşünmedi mi? Bu derleyiciyle ilgili bir sınırlama mı? " Enum " anahtar kelimesinin " , JVM için üretilen kodu temsil eden sözdizimsel şeker olarak uygulandığı bu sınırlamayı anlamıyorum.
Bunu bana kim açıklayabilir? Cevap vermeden önce şunu düşünün:
- Genel türlerin silindiğini biliyorum :-)
- Class nesnelerini kullanan geçici çözümler olduğunu biliyorum. Bunlar geçici çözümlerdir.
- Genel türler, uygun olan her yerde derleyici tarafından üretilen tür yayınlarına neden olur (örneğin, convert () yöntemini çağırırken
- <T> genel türü, numaralandırmada olacaktır. Bu nedenle, numaralandırmanın değişmez değerlerinin her birine bağlıdır. Dolayısıyla derleyici, aşağıdaki gibi bir şey yazarken hangi türün uygulanacağını bilirdi.
String string = LITERAL1.convert(myObject); Integer integer = LITERAL2.convert(myObject);
- Aynısı
T getvalue()
yöntemdeki genel tür parametresi için de geçerlidir . Derleyici, çağrı yaparken tür atama uygulayabilirString string = someClass.getValue(LITERAL1)