Bu, yeni bir soru gibi görünüyor, ancak Java ile en son çalıştığımda, dilin jenerik değeri yoktu.Bir jenerik üst öğe aracılığıyla erişilen bir alt sınıftaki Java statik üyeleri
public abstract class AbstractBase { .... }
public class ConcreateSubA extends AbstractBase { .... }
public class ConcreateSubB extends AbstractBase { .... }
...
public class ConcreateSubZZ9PluralZAlpha extends AbstractBase { .... }
...
Bazı eski kod temizlemeye çalışıyorum ve tekrarlayan mükerrer bir ton tüm içine çarpanlarına olabilir bir yer var: Bir sınıf hiyerarşisi vardır (isimler olabildiğince genelleştirilmiş gibi olacaktır olarak değiştirildi) jenerikler üzerinden tek bir rutin. (Bu rutin çağrıldığında, bu somut sınıfların sadece biri üzerinde işlemesi için ihtiyaç duyduğu çünkü generics düşünüyorum.)
rutin görünüyor
public <Thing extends AbstractBase> void someFunc()
{
another_function_call (Thing.concreteSpecialToken);
// could also be
// another_function_call (Thing.concreteSpecialToken());
// if methods are more feasible than fields
// Cannot use
// another_function_call (Thing().concreteSpecialToken());
// because creating instances of these types is a Major Operation[tm]
}
gibi milyonlarca hatları hakkında bilgi gidiyorum Ancak, önemli olan budur: someFunc()
, parametrik tipte (aslında argümanları alır, ancak bunların hiçbiri Nesnelerdir ve hiçbir çıkarım yoktur). Sonunda özel bir jeton almam gerekiyor ve burası bulanıklaşıyorum.
Simgeler her bir beton sınıfı için çok büyük boyutlu benzersiz dizelerdir. Sınıf tabanlı, örnek tabanlı değiller. Asıl jeton değeri, her bir alt sınıfta private static final
alanı olarak bildirilir. Bu nedenle bir alt sınıfın genel yöntemlerini/alanlarını (sonunda) bir alt sınıfın özel statik alanına getirmesi için kullanmalıyım. Açıkçası, tabanda bir abstract static
yöntemini bildiremiyorum, çünkü bu hiç mantıklı değil. Veriler örnek temelliyse, bu temel sınıfta bir polimorfik getter ile önemsiz olur, ancak alt sınıf şeyler statiktir.
Burada bir Java jenerik özelliği yok gibi hissediyorum, ancak whatever
soyut temel sınıfında bildirmek mümkün olan bir şey olmadıkça Thing.whatever()
kullanamazsınız. Java'nın kısıtlamalarına ya da boşluğu kapatmaya çalışan uzmanlık eksikliğime karşı koşuyorum. Benim vaat ettiğim bir girişimi de, sınıf hiyerarşisinin sonuna kadar bir kod çoğaltması vardı, soyut kodları tam olarak aynı kodla tanımladı.
+1 ZZ9PluralZAlpha' :-) –