Jeneriklerle çalışma zamanı tip kontrolü için iki seçenek:
Seçenek 1 - Yapıcıyı boz
Diyelim ki indexOf (...) 'i geçersiz kıldınız ve tüm koleksiyonu yinelemek için kendinizi sadece performans için kontrol etmek istiyorsunuz.
Böyle pis bir kurucu olun:
public MyCollection<T>(Class<T> t) {
this.t = t;
}
Ardından türü kontrol etmek için isAssignableFrom'u kullanabilirsiniz .
public int indexOf(Object o) {
if (
o != null &&
!t.isAssignableFrom(o.getClass())
) return -1;
//...
Nesnenizi her başlattığınızda, kendinizi tekrarlamanız gerekir:
new MyCollection<Apples>(Apples.class);
Buna değmeyeceğine karar verebilirsiniz. ArrayList.indexOf (...) uygulamasında , türün eşleşip eşleşmediğini kontrol etmezler.
Seçenek 2 - Bırakalım
Bilinmeyen tipinizi gerektiren soyut bir yöntem kullanmanız gerekiyorsa, gerçekten istediğiniz tek şey derleyicinin instanceof hakkında ağlamayı bırakmasıdır . Bunun gibi bir yönteminiz varsa:
protected abstract void abstractMethod(T element);
Bu şekilde kullanabilirsiniz:
public int indexOf(Object o) {
try {
abstractMethod((T) o);
} catch (ClassCastException e) {
//...
Derleyiciyi kandırmak için nesneyi T'ye (genel türünüze) döküyorsunuz. Oyuncunuz çalışma zamanında hiçbir şey yapmaz , ancak soyut yönteminize yanlış türde nesne geçirmeye çalıştığınızda yine de bir ClassCastException alırsınız.
NOT 1: Soyut yönteminizde ek denetlenmemiş dökümler yapıyorsanız, ClassCastExceptions öğeniz burada yakalanır. Bu iyi ya da kötü olabilir, bu yüzden düşünün.
NOT 2: instanceof komutunu kullanırken ücretsiz bir boş denetim alırsınız . Kullanamadığınız için çıplak elinizle null olup olmadığını kontrol etmeniz gerekebilir.
Class.isAssignableFrom
.