Java Generics and Collections kitabında Get and Put isminde bir prensipden bahsediliyor. Java Generics wildcard kullanımı bu prensip takip edildiğinde daha kolaylaşıyor. Prensip şöyle:
Eğer bir yapıdan (liste, map vs.) nesne ediniyorsanız (get) extends wildcard, bir yapıya nesne ekliyorsanız (put) super wildcard kullanın. Bir yapı üzerinde bu iki işlemi birden yapıyorsanız, o zaman wildcard kullanmayın.
Bunu bir örnek ile açıklayalım. Aşağıdaki metot bir listeden diğer bir listeye nesneleri kopyalamak için kullanılan jenerik bir metot.
public static <T> void copy(List<? super T> dest, List<? extends T> src) { for (int i = 0; i < src.size(); i++) { dest.set(i, src.get(i)); } }
copy metodunun ilk parametresi nesnelerin kopyalanacağı, yani put yapılacak olan liste, ikinci parametresi nesnelerin alındığı, yani get edildiği liste. Şu şekilde bir listeyi diğer bir listeye kopyalayabiliriz:
List<Object> objs = Arrays.<Object>asList("String", 1, 3.14); List<Integer> ints = Arrays.<Integer>asList(1,2); copy(objs, ints);
dest isimli parametre put işlemi yapıldığı için super wildcard’ını, src isimli parametre get yapıldığı için extends wildcard’ını kullanıyor.
Bir iterator kullanıldığında bir yapıdan get işlemi ile değerler edinilir. Bu durumda extends wildcard kullanılmalı. Aşağıdaki örnekte sum metodu bir listede yer alan Number sınıfı ve altsınıflarından oluşan nesnelerin değerlerini topluyor. Buna göre bu metodu sum(Arrays.
public static double sum(Collection<? extends Number> nums) { double s = 0.0; for (Number num : nums) s += num.doubleValue(); return s; }
EOF (End Of Fun)
Özcan Acar
İleri Java kategorisinden son yazılar
- Java 9 ile Modül Bazlı Yazılım - February 3rd, 2018
- JVM Nasıl Çalışır Yazı Serisi - Java Just In Time Compiler (JIT) Nasıl Çalışır? - May 14th, 2016
- JVM Nasıl Çalışır Yazı Serisi – JVM Stack Nedir ve Nasıl Çalışır? - January 8th, 2015
- JVM Nasıl Çalışır Yazı Serisi - Java Dilinde Neden Göstergeçler (Pointer) Yok? - December 30th, 2014
- JVM Nasıl Çalışır Yazı Serisi - Çalışan Bir Java Uygulamasında Bytekod Nasıl Değiştirilir? - November 2nd, 2014
- JVM Nasıl Çalışır Yazı Serisi - Java String Nesnelerinin Hafıza Kullanımı Nasıl Azaltılır? - September 18th, 2014
- Standart Java API’ler Neden Tercih Edilmeli? - April 6th, 2014
- JVM Nasıl Çalışır Yazı Serisi – Java Hotspot, Assembly Kod, Hafıza Bariyerleri ve Volatile Analizi - November 8th, 2013
- Java'da Bilinmeyenler - July 8th, 2012
- JVM Nasıl Çalışır Yazı Serisi – Old Generation Parallel Garbage Collector Hatası - May 28th, 2012
Tarık
01 Şubat 2013Hocam .NET’e gelin rahat edin :) 400 küsür JVM dili arasında boğulmayın :)
Yukarıdaki bi dolu kodun C# daki çözümünü vermek isterim ;
public static class Foo
{
public static decimal? Sum(IEnumerable items)
{
return items.Sum(x => x as decimal?);
}
}
Özcan Acar
01 Şubat 2013Java 8 ile Java diline lambda, diger adi ile Closure yapilari eklenecek. Tasarimcilari örnek olarak C# dilini almislar. Java 8 ile ayni seyi Java dilinde de yapmak mümkün olacak.