SORU
9 ŞUBAT 2009, PAZARTESİ


Nasıl Java genel bir dizi oluşturmak için?

Java jenerik uygulanması nedeniyle, bu gibi bir kod olabilir mi:

public class GenSet<E> {
    private E a[];

    public GenSet() {
        a = new E[INITIAL_ARRAY_LENGTH]; // error: generic array creation
    }
}

Ne tür güvenlik korurken bu uygulayabilirim?

Böyle giderse Java forumlarında bir çözüm gördüm

import java.lang.reflect.Array;

class Stack<T> {
    public Stack(Class<T> clazz, int capacity) {
        array = (T[])Array.newInstance(clazz, capacity);
    }

    private final T[] array;
}

Ama ben gerçekten neler olup bittiğini anlamıyor. Herkes yardımcı olabilir?

CEVAP
9 ŞUBAT 2009, PAZARTESİ


Karşılığında bir soru sormak istiyorum: GenSet "" veya""? denetlenmeyen kontrol edilir Bu ne anlama geliyor?

  • Kontrol etti:güçlü yazarak. GenSet açıkça bilir ne tür nesneleri içerir (yani onun yapıcı olduğunu açıkça adında bir Class<E> değişken ve Yöntem atar bir özel durum olduğunda onlar geçirildi bağımsız olmayan tip E. Collections.checkedCollection bkz.

    ->bu durumda, yazmalısın:

    public class GenSet<E> {
    
        private E[] a;
    
        public GenSet(Class<E> c, int s) {
            // Use Array native method to create array
            // of a type only known at run time
            @SuppressWarnings("unchecked")
            final E[] a = (E[]) Array.newInstance(c, s);
            this.a = a;
        }
    
        E get(int i) {
            return a[i];
        }
    }
    
  • Denetlenmeyen:zayıf yazmaya. Hiçbir tür denetlemesi aslında nesneleri değişken olarak geçirilen herhangi bir yapılır.

    ->bu durumda, yazmalısın

    public class GenSet<E> {
    
        private Object[] a;
    
        public GenSet(int s) {
            a = new Object[s];
        }
    
        E get(int i) {
            @SuppressWarnings("unchecked")
            final E e = (E) a[i];
            return e;
        }
    }
    

    Dizinin bileşen türü türü parametre: erasure olması gerektiğini unutmayın

    public class GenSet<E extends Foo> { // E has an upper bound of Foo
    
        private Foo[] a; // E erases to Foo, so use Foo[]
    
        public GenSet(int s) {
            a = new Foo[s];
        }
    
        ...
    }
    

Tüm bu sonuçlar bir bilinen ve kasıtlı zayıflık jenerik Java: oldu hayata kullanarak silme, yani "genel" sınıfları bilmiyorum ne tür bir argüman onlar oluşturulan çalışma zamanında, ve bu nedenle değil sağlamak tipi emniyet sürece bazı açık mekanizması (tip-kontrol) uygulanır.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Jason Rosolowski

    Jason Rosolo

    25 EKİM 2006
  • Jonah Penna

    Jonah Penna

    11 EYLÜL 2005
  • tseyina

    tseyina

    2 AĞUSTOS 2006