cuốn sách gpt4 ai đã làm

Tự động đóng hộp các chữ số: khởi tạo trình bao bọc và truyền các đối số phương thức không nhất quán

In lại Tác giả: Taklimakan Thời gian cập nhật: 2023-11-03 04:28:06 28 4
mua khóa gpt4 Nike

Hãy xem xét hai tình huống:

//1
Short s = 10; // rõ ràng là biên dịch

//2
takeShort(10); //lỗi - int không áp dụng được

//Ở đâu:
static void takeShort(Short s) {}

Tôi giả sử trường hợp 1 được trình biên dịch thay đổi thành:

_temp_s ngắn = 10;
Ngắn s = Short.valueOf(_temp_s);

Bạn có thể giải thích trình biên dịch đang cố gắng thực hiện điều gì trong trường hợp 2 nên nó không biên dịch được không? Nếu nó không thử áp dụng autoboxing như trường hợp 1 thì tại sao?

biên tập

Tham chiếu đến JSL trong câu trả lời của johnchen902 giải thích hành vi của trình biên dịch.

Vẫn chưa hoàn toàn rõ ràng tại sao JLS không hỗ trợ "chuyển đổi thô thu hẹp theo sau là chuyển đổi quyền anh" cho chuyển đổi cuộc gọi phương thức, giống như đối với chuyển đổi gán các biểu thức không đổi kiểu byte, short, char hoặc int. Có ý tưởng gì không?

câu trả lời hay nhất

s ngắn = 10;

这是一个chuyển đổi bài tập,10là một biểu thức hằng số. JLS说:

5.2. Chuyển đổi bài tập

Chuyển đổi phép gán xảy ra khi giá trị của một biểu thức được gán cho một biến: loại biểu thức phải được chuyển đổi thành loại của biến.

......

Ngoài ra, nếu biểu thức là biểu thức không đổi có kiểu byte, short, char hoặc int:

  • Chuyển đổi nguyên thủy thu hẹp theo sau là chuyển đổi quyền anh có thể được sử dụng nếu loại biến là:
    • Short và giá trị của biểu thức hằng được biểu thị bằng loại short.

takeShort(10);

这是一个Chuyển đổi cuộc gọi phương thức. JLS说:

5.3. Chuyển đổi lời gọi phương thức

Chuyển đổi lệnh gọi phương thức được áp dụng cho từng giá trị đối số trong lệnh gọi phương thức hoặc hàm tạo: loại biểu thức đối số phải được chuyển đổi thành loại của tham số tương ứng.

Bối cảnh gọi phương thức cho phép sử dụng một trong những điều sau đây:

  • chuyển đổi danh tính
  • một sự chuyển đổi nguyên thủy mở rộng
  • một chuyển đổi tham chiếu mở rộng
  • chuyển đổi quyền anh tùy chọn, sau đó mở rộng chuyển đổi tham chiếu
  • một chuyển đổi mở hộp tùy chọn, theo sau là một chuyển đổi nguyên thủy mở rộng.

......

Nếu loại biểu thức không thể được chuyển đổi thành loại tham số bằng một chuyển đổi được phép trong ngữ cảnh gọi phương thức thì sẽ xảy ra lỗi thời gian biên dịch.

Không giống như chuyển đổi bài tập, các chuyển đổi được liệt kê ở trên không thể chuyển đổiint转换为Ngắn, do đó xảy ra lỗi thời gian biên dịch.

Thật không may, một số người đã từ chối bản chỉnh sửa của kiruwka trước khi tôi phê duyệt nó, vì vậy tôi đã tự mình chỉnh sửa nó

Ví dụ chuyển đổi cuộc gọi phương thức:

// takeInteger(int) takeDouble(double) takeObject(Object) takeIntegerObject(Integer)

takeInteger(5); // một chuyển đổi danh tính
takeDouble(5); // một chuyển đổi nguyên thủy mở rộng
takeObject(new Integer(5)); // chuyển đổi tham chiếu mở rộng
takeIntegerObject(5); // một chuyển đổi quyền anh
takeObject(5); // chuyển đổi quyền anh theo sau là mở rộng chuyển đổi tham chiếu
takeInteger(new Integer(5)); // một chuyển đổi mở hộp
takeDouble(new Integer(5)); // một chuyển đổi mở hộp, theo sau là một chuyển đổi nguyên thủy mở rộng.

Về java - tự động đóng hộp các chữ số: khởi tạo trình bao bọc và truyền các đối số phương thức không nhất quán, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/16505959/

28 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress