Java'da Widening ve Autoboxing

2013-06-05 20:08:31


Java dilinde autoboxing kavramının ne olduğunu daha önce anlatmıştım. Buradan o yazıma ulaşabilirsiniz. Yine de kısaca bahsedeyim. Autoboxing primitive tipten wrapper sınıflara otomatik dönüşümdür. Örneğin; int primitive tipindeki bir değişkeni Integer parametre alan bir metoda gönderirsek, compiler tarafından otomatik olarak int'den Integer'a dönüşüm yapılır. Widening ise daha geniş bir tipe dönüşümdür. Örneğin; short tipinden int tipine dönüşüm wideningdir. Çünkü int tipi short tipinden daha geniştir. Aşağıdaki kodda short tipindeki bir sayı int tipinde parametre alan metoda geçirilmiştir. Burada shorttan int'e genişletme yapılmıştır. Kodun çıktısı int:3 şeklindedir.


public class Widening 
{
	public static void main(String[] args) 
	{
		short shortNum = 3;		
		foo(shortNum);
	}
	
	public static void foo( int sayi )
	{
		System.out.println("int:"+sayi);
	}
		
}

Eğer kodda hem widening yapılabiliyor hem de autoboxing yapılabiliyor ise compiler widening'i tercih eder. Aşağıdaki kodda short tipinde bir değişken foo metoduna gönderilmiştir. Widening tercih edildiği için, compiler void foo( int sayi ) metodunu çağıracaktır. 


public class AutoboxingAndWidening 
{
	public static void main(String[] args) 
	{
		short shortNum = 3;				
		foo(shortNum);
	}
	
	public static void foo( Short sayi )
	{
		System.out.println("Short:"+sayi);
	}
	
	public static void foo( int sayi )
	{
		System.out.println("int:"+sayi);
	}
}

Peki bir wrapper'dan diğerine widening olur mu ? Örneğin; Integer'dan Long'a genişletme olur mu ? Cevap: Olmaz :)  Wrapper sınıflar arasında genişletme yapılmaz. Aşağıdaki kodda Integer tipindeki sayı değişkeni wrapper sınıflarda widening olmadığı için void foo(Number sayi) metoduna gönderilmiştir. Çünkü, Integer bir Long değildir, fakat Integer bir Number'dır. Integer sınıfı Number sınıfından türemiştir. 

public class AutoboxingAndWidening 
{
	public static void main(String[] args) 
	{
		Integer sayi = 5;
		foo(sayi);
	}
		
	public static void foo( Long sayi )
	{
		System.out.println("Long:"+sayi);
	}
	
	public static void foo( Number sayi )
	{
		System.out.println("Number:"+sayi);
	}

}

İyi çalışmalar :)