Trong Java 5.0, lớp wrapper đã trở nên dễ dàng hơn để sử dụng. Java 5.0 đã giới thiệu chuyển đổi tự động giữa kiểu nguyên thủy và lớp trình bao bọc tương ứng.
Từ kiểu nguyên thủy đến lớp trình bao bọc corresponse được gọi là autoboxing, quá trình ngược lại được gọi là unboxing. Tự động và hủy hộp cũng áp dụng cho các cuộc gọi phương thức. Ví dụ, bạn có thể chuyển đối số kiểu int cho một phương thức có tham số chính thức của kiểu Integer.
Ngoại lệ NullpointerException xảy ra Khi bỏ hộp tham chiếu lớp bao bọc rỗng thành kiểu nguyên thủy. Ví dụ, mã sẽ biên dịch nhưng nó sẽ ném một NullpointerException vào thời gian chạy.
Long L = null; long l = L; ...
Chuyển đổi quyền anh chuyển giá trị của kiểu gốc thành giá trị tương ứng của loại tham chiếu. Nhưng các kiểu nguyên thủy không thể được mở rộng/Thu hẹp thành các lớp Wrapper và ngược lại. Ví dụ:
byte b = 43; Số nguyên I1 = 23; // Giá trị nguyên không đổi Integer I2 = (int) b; // Truyền tới loại int Long L1 = 23; // biên dịch lỗi vì 23 là giá trị số nguyên Long L2 = (Long) 23; // không thể truyền giá trị số nguyên thành lớp bao bọc dài Long L3 = 23L; Dài L4 = (dài) 23;
Hạn chế này cũng được áp dụng cho phương pháp gọi:
public class MyClass
{
public void method(Long i)
{
System.out.println("Here");
}
public static void main(String[] args)
{
MyClass s = new MyClasslass();
//s.method(12);
// error s.method(12L);
// ok
}
}
•When invoking a method from multiple overloading methods, For the matching method process, the Java compiler will perferance the order of primitive types (Widening Primitive Conversion), wrapper class (Boxing Conversion), and var-args. For example,
public class MyClass
{
public void method(Long x, Long y)
{
System.out.println("method(Long x, Long y)");
}
public void method(long x, long y)
{
System.out.println("method(long x, long y)");
}
public void method(long... x)
{
System.out.println("method(long... x)");
}
public static void main(String[] args)
{
long x, y;
x = y = 0;
MyClass s = new MyClass();
s.method(x, y);
}
}
Kết quả là method(long x, long y)
. Trình biên dịch Java sẽ kiểm tra các kiểu nguyên thủy phù hợp, sau đó nó sẽ tìm kiếm các kiểu Wrapper.
public class MyClass
{
public void method(Long x, Long y)
{
System.out.println("method(Long x, Long y)");
}
public void method(int x, int y)
{
System.out.println("method(int x, int y)");
}
public void method(long... x)
{
System.out.println("method(long... x)");
}
public static void main(String[] args)
{
long x, y;
x = y = 0;
MyClass s = new MyClass();
s.method(x, y);
}
}
Kết quả là method(Long x, Long y)
. Trình biên dịch Java ưu tiên cho chữ ký của phương thức lớp Wrapper phù hợp với phương thức khác với phương thức varargs nguyên thủy.
public class MyClass
{
public void method(Double x, Double y)
{
System.out.println("method(Double x, (Double y)");
}
public void method(int x, int y)
{
System.out.println("method(int x, int y)");
}
public void method(long... x)
{
System.out.println("method(long... x)");
}
public static void main(String[] args)
{
long x, y;
x = y = 0;
MyClass s = new MyClass();
s.method(x, y);
}
}
Kết quả là method(long ...x)
. Trình biên dịch sẽ không thu hẹp giá trị nguyên thủy "dài" thành "int"; Ngoài ra, nó không thể kéo dài đến lớp đôi. Chỉ có thể sử dụng phương thức var-args.
public class MyClass
{
public void method(Long x, Long y)
{
System.out.println("method(Long x, Long y)");
}
public static void main(String[] args)
{
int x, y;
x = y = 0;
MyClass s = new MyClass();
s.method(x, y);
}
}
Đối số không thể chuyển thành "dài" và sau đó là "Long". Bạn sẽ nhận được lỗi biên dịch.
- Để tiết kiệm bộ nhớ, hai trường hợp của các đối tượng bao bọc sau sẽ luôn là == khi giá trị nguyên thủy của chúng giống nhau. Vui lòng đọc Tại sao chuyển đổi tự động đôi khi trả lại cùng một tham chiếu?
Quyền tự động vô ý (un) có thể là một hog hiệu suất, nếu được thực hiện trong vòng lặp được thực thi nhiều lần. Đây có thể là lý do tại sao một số người coi đó là điều xấu xa. Tuy nhiên, vấn đề thực sự ở đây là viết mã bất cẩn (và thiếu hồ sơ), thay vào đó là tính năng ngôn ngữ. –
Nếu tôi sử dụng generics, tôi có thể tránh autoboxing và unboxing không? – John
@John Bạn có thể tránh autoboxing không cần thiết và unboxing bằng cách xem xét cẩn thận cho dù sử dụng nguyên thủy hoặc wrapper loại và kiểm tra nếu có phương pháp gọi chúng tôi gây ra boxing. Tuy nhiên, vì bạn cần phải sử dụng loại wrapper với generics, thường không có cách nào để tránh nó hoàn toàn. – Carlos