java generic array how simulate generic arrays java
Bu Öğretici, Java'da Nesne Dizisi ve Yansıma Sınıfını Basit Örnekle Kullanarak Genel Dizinin İşlevselliğinin Nasıl Simüle Edileceğini Açıklar:
Zaten tartıştık Java jenerikleri önceki eğitimlerimizden birinde. Java, türlerden bağımsız olarak bildirilebilen genel sınıflara, yöntemlere vb. İzin verir. Ancak Java, dizinin genel olmasına izin vermez.
Bunun nedeni, Java'da dizilerin bileşenleriyle ilgili bilgileri içermesi ve bu bilginin çalışma zamanında bellek ayırmak için kullanılmasıdır. Tür silme nedeniyle jenerikler kullanıldığında, bayt kodu herhangi bir genel bilgi içermez.
=> Sıfırdan Java Öğrenmek İçin Burayı Ziyaret Edin.
Ne öğreneceksin:
Java'da Genel Dizi
Genel bir dizi tanımladıysanız, bileşen türü çalışma zamanında bilinmeyecektir. Bu nedenle dizilerin Java'da jenerik olarak tanımlanması tavsiye edilmez.
Generic Array tanımı aşağıda gösterildiği gibidir:
E () newArray = new E(length);
Tür bilgileri çalışma zamanında mevcut olmadığından, derleyici somutlaştırılacak kesin türü bilmez.
Bu nedenle, diziler yerine, jenerik gerekli olduğunda, Java Koleksiyonları çerçevesinin liste bileşenini tercih etmelisiniz. Ancak Java'nın nesne dizisi ve yansıtma özelliğini kullanarak dizi benzeri jenerik yapılar oluşturabilirsiniz.
Farklı veri türlerinin dizilerini tanımlamamıza izin veren bu iki yaklaşım aşağıda ayrıntılı olarak açıklanmıştır.
oracle sql sorgular cevaplı örnekler pdf
Genel Diziyi Oluşturun ve Başlatın
Bu bölümde, doğası gereği genel olan dizi benzeri bir yapı oluşturalım. Bu yapıları kullanarak, veri tipini bir argüman olarak sağlayarak diziler yaratabileceksiniz.
Nesne Dizisini Kullanma
Bu yaklaşım, ana dizi sınıfının bir üyesi olarak Nesneler türündeki diziyi kullanır. Dizi öğelerini okumak ve ayarlamak için get / set yöntemlerini de kullanıyoruz. Ardından, gerektiği gibi veri türünü sağlamamıza izin veren ana dizi sınıfını başlatırız.
Bu, genel diziyi simüle eder.
Aşağıdaki program, Generic dizi benzeri bir yapı oluşturmak için nesne dizisinin kullanımını göstermektedir.
import java.util.Arrays; class Array { private final Object() obj_array; //object array public final int length; // class constructor public Array(int length) { // instantiate a new Object array of specified length obj_array = new Object (length); this.length = length; } // get obj_array(i) E get(int i) { @SuppressWarnings('unchecked') final E e = (E)obj_array(i); return e; } // set e at obj_array(i) void set(int i, E e) { obj_array(i) = e; } @Override public String toString() { return Arrays.toString(obj_array); } } class Main { public static void main(String() args){ final int length = 5; // creating integer array Arrayint_Array = new Array(length); System.out.print('Generic Array :' + ' '); for (int i = 0; i Çıktı:
unix'te grep komutu nedir
Yukarıdaki programda, jenerik olan bir sınıf Array tanımladık. Nesne dizisi, bir yapıcı ve uzunluk kullanılarak başlatılan sınıfın bir üyesidir. Ayrıca, belirli bir türdeki bir dizi öğesini okumak ve ayarlamak için kullanılan genel get ve set yöntemlerini de kullanırız.
Sonra bu dizi sınıfının örneklerini oluşturuyoruz. Örnek oluştururken istediğimiz türü belirleyebiliriz. Yukarıdaki programda, Tamsayı ve Dize türünde iki dizi oluşturduk ve sonra bu dizileri uygun değerlerle (set yöntemini kullanarak) doldurduk.
Son olarak, geçersiz kılınan 'toString' yöntemini kullanarak, bu örneklerin her birinin içeriğini görüntüleriz.
Yansımayı Kullanma
Bu yaklaşımda, türü yalnızca çalışma zamanında bilinecek olan genel bir dizi oluşturmak için bir yansıma sınıfı kullanıyoruz.
Yaklaşım, tek bir farkla öncekine benzer; yani, veri türü bilgilerini sınıf yapıcısına açıkça ileterek bir nesne dizisini başlatmak için yapıcının kendisinde yansıma sınıfını kullanırız.
Bu tür bilgiler Array.newInstance yansıma yöntemine aktarılır.
Aşağıdaki program genel bir dizi oluşturmak için yansımanın kullanımını gösterir . Tüm program yapısının, yalnızca yansıtma özelliklerinin kullanımındaki farkla önceki yaklaşıma benzer olduğunu unutmayın.
importjava.util.Arrays; class Array { private final E() objArray; public final int length; // class constructor public Array(ClassdataType, int length){ // create a new array with the specified data type and length at runtime using reflection this.objArray = (E()) java.lang.reflect.Array.newInstance(dataType, length); this.length = length; } // get element at objArray(i) Eget(int i) { returnobjArray(i); } // assign e to objArray(i) void set(int i, E e) { objArray(i) = e; } @Override public String toString() { return Arrays.toString(objArray); } } class Main { public static void main(String() args){ final int length = 5; // create array with Integer as data type Arrayint_Array = new Array(Integer.class, length); System.out.print('Generic Array:' + ' '); for (int i = 0; i Çıktı:
Yukarıdaki program, Arrays jenerik sınıfından oluşturulan Tamsayı ve Dize gibi iki tür diziyi gösterir.
Genel Dizi Oluşturma Hatası
Java'da jenerik diziler yaratmanın sonuçlarını ve Java'da jenerik dizilere sahip olmanın neden mümkün olmadığını zaten tartışmıştık. Bunun bir başka açıklaması, Java'daki dizilerin ortak değişken olduğu halde jeneriklerin olmadığıdır. Jenerikler değişmez.
Kovaryans derken, bir alt tip dizisinin süper tip referansına atanabileceğini kastediyoruz.
Bu, aşağıdaki ifadenin iyi çalışacağı anlamına gelir.
Number numArray() = new Integer(10);
Tamsayı, Sayının bir alt türü olduğundan, yukarıdaki ifade iyi derler.
Ancak aynı kavramı jeneriklerle kullanırsak, işe yaramayacaktır, yani jeneriklerle, bir süper tip jenerik için jenerik alt tip atayamayız.
Deyim, ListobjList = new ArrayList (); jenerik diziler gibi kovaryant olmadığından bir derleme hatası verir.
Yukarıdaki nedeni aklımızda tutarak, aşağıdaki gibi bir şeye de sahip olamayız:
public static ArrayList() myarray = new ArrayList(2);
Bu ifade, hata ile derlenemez, 'Genel dizi oluşturma' çünkü belirli bir jenerik türe bir başvuru dizisi bildiremiyoruz.
Bununla birlikte, joker karakter kullanarak belirli bir jenerik türe bir referans dizisi oluşturabiliriz. Yukarıdaki ifade, aşağıda gösterildiği gibi bir joker karakter kullanılarak küçük bir değişiklikle başarıyla derlenebilir.
public static ArrayListmyarray = new ArrayList(5);
Yukarıdaki ifade başarıyla derlenecektir.
Aşağıdaki program, joker karakter kullanımının bir gösterimini göstermektedir.
anime tv sizin için tamamen ücretsiz
import java.util.*; //generic array class classArr { T tarray(); Arr(T myarray()) { tarray = myarray; } @Override public String toString() { return Arrays.toString(tarray); } } public class Main { public static void main(String() args) { // Arrtarray() = new Arr(5); //error: generic array creation //initialize new array objects Arr arr1 = new Arr(new Integer(){2,4,6,8,10}); System.out.print('Array with Integer type:' + ' '); System.out.println(arr1); Arr arr2 = new Arr(new String(){'aa', 'bb', 'cc', 'dd'}); System.out.print('Array with String type:' + ' '); System.out.println(arr2); //define array objects using wildcard Arrarr3() = new Arr(5); arr3(0) = new Arr(new Integer(){10, 20, 30, 40, 50}); System.out.println('Integer array: ' + arr3(0)); arr3(1) = new Arr(new Float(){1.1f, 2.2f, 3.3f, 4.4f, 5.5f}); System.out.println('Float array: ' + arr3(1)); } }
Çıktı:
Yukarıdaki programda, jeneriklerin değişmezliğini gösteren ana yöntemde ilk ifadeye sahibiz. Bu ifade derleme hatasını yanıp söner (yorumlarda gösterilir). Bir sonraki dizi oluşturma, jenerik kurallarına göredir ve bu nedenle başarıyla derlenirler.
Sıkça Sorulan Sorular
S # 1) Genel Dizi nedir?
Cevap: Veri türünden bağımsız olan ve çalışma zamanında bilgi türü değerlendirilen diziler Genel dizilerdir. Jenerikler, C ++ 'daki şablonlara benzer.
S # 2) Java'da Generic Array oluşturabilir misiniz?
Cevap: Diziler Java'da birlikte değişkendir, yani herhangi bir alt sınıf dizisi bir süper tip dizisine atanabilir. Bununla birlikte, jenerikler değişmezdir, yani alt sınıf türü dizisini üst sınıf türüne atayamazsınız.
İkinci olarak, jenerik bilgiler JVM'den kaldırılır ve bu nedenle, çalışma zamanında bellek tahsisi yapılan dizi, diziye hangi türün atanacağını bilmez. Bu nedenle, diziler ve jenerikler Java'da iyi gitmez.
S # 3) Java'da E Tipi nedir?
Cevap: jenerikler için bir yer tutucu görevi görür ve her tür öğeyi temsil eder.
S # 4) Java'da Tür Silme nedir?
Cevap: Java derleyicisi tarafından gerçekleştirilen ve jeneriklerde kullanılan parametreli türlerin kaldırıldığı ve bayt kodundaki ham türlerle eşleştirildiği bir işlem. Bu nedenle, bayt kodu jenerikler hakkında herhangi bir bilgi içermez.
S # 5) Java'da Ham Tür nedir?
Cevap: Ham türler, tür parametresi kullanılmayan genel türlerdir. Örneğin. Liste ham bir türdür; List parametreleştirilmiş bir türdür.
Sonuç
Java'da, genel dizi doğrudan tanımlanamaz, yani bir dizi referansına atanmış parametreli bir türe sahip olamazsınız. Bununla birlikte, nesne dizilerini ve yansıma özelliklerini kullanarak, genel dizi oluşturmanın benzetimini yapabilirsiniz.
Bu eğitimde bu iki yaklaşımı, genel dizi oluşturma hatasının ayrıntıları ve bu tür bir hatayı önleme olasılıkları ile birlikte gördük. Özetle, Java'da, jenerikler değişmezken diziler eşdeğişken olduğundan diziler ve jeneriklerin el ele gitmediğini söyleyebilirsiniz.
=> Mükemmel Java Eğitim Kılavuzuna Buradan Bakabilirsiniz.
Önerilen Kaynaklar
- Java Dizisi - Java'da Bir Dizinin Elemanları Nasıl Yazdırılır?
- Kod Örnekleriyle Java Dizi Uzunluğu Eğitimi
- Örneklerle Java Yansıtma Eğitimi
- Java Dizisi - Java'da Bir Dizi Bildirin, Oluşturun ve Başlatın
- Java Dizilerine ve İlgili Kavramlara Giriş
- Örneklerle Java Jenerik Eğitimi
- Java SWING Eğitimi: Konteyner, Bileşenler ve Olay İşleme
- Java DataTypes, Loops, Arrays, Switch ve Assertions