2013-04-29 34 views
13

tôi đã tự hỏi tại sao Java không cho phép đúc từ một boolean đến một int, như vậy:Tại sao Java không cho phép truyền Boolean -> Int?

boolean foo = true; 
int bar = (int)foo; 

này có thể được thực hiện trong một dòng mã, ví dụ,

bar = foo ? 1 : 0; 

nhưng có vẻ như cách tốt hơn và dễ đọc hơn là cho phép nhập kiểu, như với doubleint. Tại sao Java không bao gồm tính năng này?

+16

Bởi vì một 'int' không phải là một' boolean'. –

+1

Quy tắc dành cho việc đúc là gì? Zero là sai, bất cứ điều gì khác là sự thật? Số âm sẽ được xử lý như thế nào? Bạn có được phép thực hiện toán học không? –

+5

* "Tại sao Java không bao gồm tính năng này?" * Người ta có thể hỏi tại sao Java không bao gồm nhiều thứ có thể đạt được trong một dòng mã duy nhất. Tôi muốn đặt 'API bloat' là lý do. –

Trả lời

23

Nó không cho phép điều này vì các nhà thiết kế Java (chính xác) nhận ra rằng quá tải boolean/integer trong C và C++ là một nguồn đáng kể của các lỗi.

(Tôi nhớ lại nhìn thấy rằng bằng văn bản trong một số lý do thiết kế, nhưng tôi không thể tìm thấy nó.)

Ví dụ:

if (i = 0) { 
    ... 
} 

là hợp pháp nhưng có lẽ một lỗi trong một ứng dụng mà được viết C hoặc C++.

Java tránh sự cố này và các sự cố khác bằng cách tạo boolean và các kiểu dữ liệu số nguyên các loại riêng biệt không thể chuyển đổi từ loại này sang loại khác. Vì vậy, ở trên là một lỗi biên dịch trong Java.


Bây giờ điều này không giải thích lý do tại sao bạn có thể không rõ ràng loại đúc một boolean một int. Nhưng tôi nghĩ rằng có thể được hiểu bằng cách quan sát như sau:

  • Bạn hiếm khi cần phải làm điều đó trong chương trình Java thực.

  • Số < -> phép boolean sẽ không khớp với cách mà các loại phôi khác hoạt động. Đặc biệt, đối với các kiểu khác có các phôi lên và xuống, và các phôi lên nhau trong Java không yêu cầu một kiểu diễn xuất rõ ràng.

  • Bạn không thể nhập số giữa các số và chuỗi hoặc giữa các chuỗi đối tượng khác. Đây là các chuyển đổi , không phải loại phôi. Và int < ->boolean cũng vậy.


1 - Tôi là cẩu thả với thuật ngữ của tôi ở đây (cố tình). Thuật ngữ Java chính xác là "mở rộng" và "thu hẹp". Thu hẹp các chuyển đổi yêu cầu loại bỏ một cách rõ ràng với một ngoại lệ hạn chế cho các chữ. Các chuyển đổi mở rộng không yêu cầu loại bỏ.

+0

Ví dụ của bạn liên quan đến chủ đề như thế nào? Nó có thể là một lỗi trong C/C++ bởi vì nó thực sự gán một giá trị cho i, không được hỗ trợ trong một mệnh đề if trong Java. Mối quan hệ với kiểu boolean là gì? – Nearoo

+0

Ví dụ này có liên quan vì nó minh họa * lý do * cho quyết định thiết kế ngôn ngữ Java không cho phép truyền từ 'int' sang' boolean'. –

+0

Ah tôi nhận được nó ngay bây giờ, nhưng không phải vì lời giải thích của bạn (xin lỗi). Đây là lý do tại sao ví dụ có liên quan: Biểu thức 'a = k' luôn trả về' k'. Vì vậy, 'if (a = 1)' không hoạt động vì Java đánh giá 'if (1)' là bất hợp pháp vì nó không đưa 'int' vào' bool'. Nhưng thực tế rằng điều này sẽ rất dễ bị lỗi thực sự là lý do? Bởi vì 'if (a = true)' vẫn hợp pháp. – Nearoo

2

Bởi vì Java là mạnh mẽ đánh máy, một boolean và một int are two completely different data types và người ta không thể được đúc để người kia - nó không thể được đúc, trên thực tế.

+18

Một thuật ngữ. Bạn không thể đúc nó bởi vì nó không thể được đúc. –

3

Java hỗ trợ mở rộng chuyển đổi trên các loại số nguyên thủy.Tuy nhiên, boolean không được coi là một kiểu số.

Chuyển đổi mở rộng được hỗ trợ được liệt kê theo "Widening Primitive Conversion" trong Đặc tả ngôn ngữ Java.

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