Autoboxing تبدیل خودکاری است که کامپایلر جاوا بین انواع اولیه و کلاسهای Wrapper مربوطه انجام میدهد. برای مثال، تبدیل int به Integer، double به Double و غیره. اگر تبدیل در جهت عکس انجام شود، به آن Unboxing گفته میشود.
Character ch = 'a';
باقی مثالهای این بخش از Generics استفاده میکنند. اگر با نحؤ Generics آشنا نیستید، بخش Generics را ببینید.
کد زیر را در نظر بگیرید:
List<Integer> ints = new ArrayList<>();
for (int i = 1; i < 50; i += 2)
ints.add(i);
اگرچه مقادیر int را بهعنوان Primitive (نه اشیای Integer) به ints اضافه میکنید، کد کامپایل میشود. چون ints لیستی از اشیای Integer است (نه لیست مقادیر int)، ممکن است تعجب کنید که چرا کامپایلر خطای زمان کامپایل تولید نمیکند. دلیلش این است که کامپایلر شیء Integerای از i ایجاد و آن را به ints اضافه میکند. کامپایلر کد بالا را در زمان اجرا به شکل زیر تبدیل میکند:
List<Integer> ints = new ArrayList<>();
for (int i = 1; i < 50; i += 2)
ints.add(Integer.valueOf(i));
تبدیل مقدار Primitive (مثلاً int) به شیء کلاس Wrapper مربوطه Integer Autoboxing نام دارد. کامپایلر جاوا Autoboxing را زمانی اعمال میکند که مقدار Primitive:
Method زیر را در نظر بگیرید:
public static int sumEven(List<Integer> ints) {
int sum = 0;
for (Integer i: ints) {
if (i % 2 == 0) {
sum+=i;
}
}
return sum;
}
چون عملگرهای باقیمانده (%) و unary plus (+=) روی اشیای Integer قابل اعمال نیستند، ممکن است تعجب کنید که چرا کامپایلر Method را بدون خطا کامپایل میکند. دلیلش این است که کامپایلر Method intValue() را در زمان اجرا فراخوانی میکند تا Integer را به int تبدیل کند:
public static int sumEven(List<Integer> ints){
int sum=0;
for(Integer i:ints) {
if(i.intValue()%2==0) {
sum+=i.intValue();
}
}
return sum;
}
تبدیل شیء نوع Wrapper Integer به مقدار Primitive مربوطه (int) Unboxing نام دارد. کامپایلر جاوا Unboxing را زمانی اعمال میکند که شیء کلاس Wrapper:
برنامهٔ Unboxing نحوهٔ کار را نشان میدهد:
import java.util.ArrayList;
import java.util.List;
public class Unboxing {
public static void main(String[] args) {
Integer i = Integer.valueOf(-8);
// ۱. Unboxing از طریق فراخوانی Method
int absVal = absoluteValue(i);
IO.println("absolute value of " + i + " = " + absVal);
List<Double> doubles = new ArrayList<>();
doubles.add(3.1416); // Π از طریق فراخوانی Method Autoboxing میشود
// ۲. Unboxing از طریق تخصیص
double pi = doubles.get(0);
IO.println("pi = " + pi);
}
public static int absoluteValue(int i) {
return (i < 0) ? -i : i;
}
}
خروجی برنامه:
absolute value of -8 = 8
pi = 3.1416
Autoboxing و Unboxing به توسعهدهندگان اجازه میدهد کد تمیزتر و خواناتری بنویسند. جدول زیر انواع Primitive و کلاسهای Wrapper مربوطه را که توسط کامپایلر جاوا استفاده میشوند فهرست میکند:
| نوع Primitive | کلاس Wrapper |
|---|---|
| boolean | Boolean |
| byte | Byte |
| char | Character |
| float | Float |
| int | Integer |
| long | Long |
| short | Short |
| double | Double |
این محتوا کاملا رایگان توسط تیم کدلپر ترجمه شده و در اختیار شما کاربران عزیز قرار گرفته است، هر گونه کپی برداری برای مقاصد غیر رایگان و بدون ذکر منبع، مورد پیگیری قانونی قرار میگیرد.
ترجمه شده از منبع: https://dev.java/learn/