2012-06-16 17 views
5

Tôi cố gắng để hiểu được đoạn mã sau:vấn đề với các thông số đúc và ngắn trong Java

public class A { 
    private void doTask() {  
     doInt(99); 
    } 

    public short doInt(short s) { 
     return 100; 
    } 
} 

Mã này đưa ra một lỗi biên dịch trên dòng "doInt (99)".

The method doInt(short) in the type A is not applicable for the arguments (int) 

Ai đó có thể giải thích lý do tại sao nó cho tôi lỗi.

+0

có thể lặp lại http://stackoverflow.com/q/5106766/269514, http://stackoverflow.com/q/2294934/269514 – Gilberto

+0

Nhiều câu hỏi trùng lặp gần đây http://stackoverflow.com/q/ 16505959/269514 – Gilberto

Trả lời

4

Hãy thử

public class A { 
    private void doTask() {  
     doInt((short)99); 
    } 

    public short doInt(short s) { 
     return (short)100; 
    } 
} 

Java nghĩ rằng tất cả các chữ (ví dụ như 99 hoặc 100) trong chương trình của bạn là int.

Nếu bạn vượt qua số lượng lớn, 12345678 chẳng hạn, số này sẽ được cắt để phù hợp với giá trị short. Java không thể cắt số mà không có bạn, vì vậy bạn phải tự mình làm. Bằng cách đó bạn thấy rằng bạn truyền int đến ngắn

+0

Truyền 100 đến ngắn là không cần thiết. Khi bạn gán một chữ số bằng chữ ngắn và khi giá trị của nó nằm trong phạm vi pháp lý, chữ được giả định là ngắn. – Xion345

+0

Có, nhưng tôi nghĩ trong phiên bản trước của java bạn cần phải làm điều này – alaster

7

Trong java, loại số nguyên mặc định là int. Java sẽ tự động upcast (ví dụ: từ short đến int), nhưng sẽ đưa ra cảnh báo với downcasting (ví dụ: từ int đến short) vì có thể mất dữ liệu.

Việc sửa chữa cho mã của bạn là thế này:

doInt((short)99); 

nhìn xuống rõ ràng này thay đổi 99 (mà là một int) vào một short, vì vậy không có (thêm) mất dữ liệu.

+0

cảm ơn rất nhiều. Tôi không thấy cảnh báo. Trên thực tế nó cung cấp cho một lỗi trình biên dịch. – Alan2

1

Bạn cần truyền 99 đoạn ngắn. Vui lòng thử các kiểu dữ liệu

public class A { 
    private void doTask() {  
     doInt((short) 99); 
    } 

    public short doInt(short s) { 
     return 100; 
    } 
} 
1

int sau thường là sự lựa chọn mặc định trừ khi có một lý do.

Và do đó 99 được coi là int.

Đọc thêm chi tiết về Primitive Data Types

Bạn cần truyền rõ ràng khi được yêu cầu.
Thay đổi doInt(99) thành doInt((short) 99) và nó sẽ hoạt động.

1

Nguyên nhân chính của lỗi là

Bạn có thể không mặc nhiên chuyển đổi kiểu dữ liệu nonliteral kích thước lưu trữ lớn hơn để ngắn

Vì vậy, thay đổi mã của bạn để sau.

public class A { 
    private void doTask() {  
     doInt((short)99); 
    } 

    public short doInt(short s) { 
     return (short)100; 
    } 
} 
+1

ans ngắn = 10; không cho tôi lỗi. – Alan2

Các vấn đề liên quan