2009-08-12 64 views
45

Tôi đang làm việc với một biến mà tôi đã khai báo là Số nguyên và phát hiện ra rằng> không phải là thành viên của Số nguyên. Dưới đây là một ví dụ đơn giản:Sự khác nhau giữa Int và Integer trong Scala là gì?

scala> i 
warning: there were deprecation warnings; re-run with -deprecation for details 
res28: Integer = 3 

scala> i > 3 
<console>:6: error: value > is not a member of Integer 
     i > 3 
     ^

so sánh với một Int:

scala> j 
res30: Int = 3 

scala> j > 3 
res31: Boolean = false 

sự khác biệt giữa Integer và Int là gì? Tôi thấy cảnh báo không dùng nữa nhưng không rõ lý do tại sao nó không được chấp nhận và, bởi vì nó đã được, tại sao nó không có một phương thức.

+0

Cảm ơn tất cả, vì những câu trả lời hữu ích. Tất cả các bạn trả lời câu hỏi của tôi, vì vậy tôi sẽ để cho câu trả lời được đánh giá cao nhất tăng lên đầu và đánh dấu đó là câu trả lời. Trong thời gian chờ đợi, tôi đã xếp hạng tất cả các câu trả lời của bạn. – pr1001

Trả lời

40

"Sự khác nhau giữa Integer và Int là gì?"

Số nguyên chỉ là bí danh cho java.lang.Integer. Int là số nguyên Scala với các khả năng phụ.

Nhìn trong Predef.scala bạn có thể thấy điều này bí danh:

/** @deprecated use <code>java.lang.Integer</code> instead */ 
    @deprecated type Integer = java.lang.Integer 

Tuy nhiên, có một chuyển đổi ngầm từ Int để java.lang.Integer nếu bạn cần nó, có nghĩa là bạn có thể sử dụng Int trong phương pháp lấy một số nguyên.

Vì lý do tại sao nó không được chấp nhận, tôi chỉ có thể đoán nó là để tránh bất kỳ sự nhầm lẫn về loại số nguyên bạn đang làm việc với.

3

Số nguyên được nhập từ java.lang.Integer và chỉ để tương thích với Java. Vì nó là một lớp Java, tất nhiên nó không thể có một phương thức gọi là "<". EDIT: Bạn có thể giảm thiểu vấn đề này bằng cách khai báo một chuyển đổi ngầm từ Integer sang Int.

implicit def toInt(in:Integer) = in.intValue() 

Bạn vẫn sẽ nhận được cảnh báo không dùng nữa.

4

Tôi nghĩ rằng vấn đề bạn đang gặp phải làm việc đánh boxing/unboxing các loại giá trị và sử dụng lớp Java Integer.

Tôi nghĩ câu trả lời là ở đây: Boxing and unboxing in Scala. Không có unboxing implict trong Scala. Bạn đã xác định i là lớp Java Integer nhưng trong số i> 3, số 3 đang được xử lý và int.

+0

liên kết bị hỏng ngay bây giờ. – 203

1

Integer là một lớp Java, java.lang.Integer. Nó khác với kiểu nguyên thủy của Java int, không phải là một lớp. Nó không thể có được < được xác định, bởi vì Java không cho phép các toán tử được định nghĩa cho các lớp.

Bây giờ, bạn có thể tự hỏi tại sao một loại như vậy tồn tại? Vâng, các kiểu nguyên thủy không thể được truyền dưới dạng tham chiếu, vì vậy bạn không thể chuyển một phương thức int đến phương thức mong đợi java.lang.Object, tương đương với ví dụ của Scala là AnyRef. Để làm điều đó, bạn đặt int bên trong đối tượng Integer và sau đó vượt qua Integer.

1

Số nguyên được nhập từ java.lang.Integer và chỉ để tương thích với Java. Vì nó là một lớp Java, tất nhiên nó không thể có một phương thức gọi là "<".

EDIT: Bạn có thể giảm thiểu vấn đề này bằng cách khai báo một chuyển đổi ngầm từ Integer sang Int.

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