2012-09-05 23 views
22

Đến từ Java đất Tôi đã cố gắng để dạy cho bản thân mình Scala. Gần đây tôi đã được toying với các loại dữ liệu Int và tôi quyết định tìm kiếm các API cho lớp Int here.cố gắng để hiểu "cuối cùng trừu tượng lớp Int tư nhân mở rộng AnyVal trong Scala

gì bối rối tôi đã định nghĩa lớp cho Int, đó là abstract final.

tôi xin lỗi nếu tôi không đọc lên về ý nghĩa của abstractfinal trong Scala trước khi đặt câu hỏi này, nhưng tôi đã tò mò, vì vậy tôi đã nhập bài đăng này ngay lập tức.

Vì vậy, những gì tôi đang cố gắng hiểu là: Các ngữ nghĩa cho abstract, finalextends khác nhau trong Scala? Một lần nữa, đó là sự hiểu biết tốt nhất của tôi rằng trong Java, người ta không thể có abstractfinal cùng một lúc. Vậy làm cách nào để diễn giải final abstract class Int private extends AnyVal?

+1

Không, họ không, ít nhất là về cơ bản (bạn vẫn không thể nhanh chóng trừu tượng, bạn không thể kế thừa/ghi đè thức). AFAIK, lý do điều này đã được thực hiện theo cách này là một số thời gian trước đây Int và các loại khác AnyVal chỉ là một sơ khai, viết lại sau đó bởi trình biên dịch tại thời gian biên dịch. Họ không phải là [cam kết này] (https://github.com/scala/scala/commit/4253124eecba6bed38f1dc961c5c4ee39a29f730) –

+0

Ồ, đó là thông tin hữu ích. Cảm ơn bạn đã chỉ ra rằng với tôi – ilango

Trả lời

28

Như om-nom-nom được chỉ ra trong chú thích, abstract cấm khởi tạo (new Int), trong khi final cấm phân lớp (new Int { ... }).

Lý do cho điều này là scala.Int được thể hiện trực tiếp bằng loại nguyên thủy nguyên thủy của máy ảo Java; các loại tương tự khác là Byte, Short, Char, Long, Float, Double, Boolean. Bởi vì chúng là các kiểu nguyên thủy trong thời gian chạy (thể hiện hiệu suất tốt hơn so với các kiểu được đóng hộp) và JVM không cho phép thêm các nguyên thủy mới, sẽ không có cách hợp pháp để mở rộng các kiểu đó. Ngoài ra không có cách nào để khởi tạo chúng khác hơn là bằng cách cho một chữ (val i: Int = 33).

Scala có các loại này để tạo ra một hệ thống đối tượng thống nhất mà không có sự khác biệt hợp lý giữa các loại nguyên thủy và 'đối tượng'. Tuy nhiên, có một sự khác biệt phân cấp ở trên cùng là AnyRef (tương ứng với java.lang.Object) và AnyVal (tương ứng với các kiểu nguyên thủy đó và thêm kiểu mới của Scala Unit).

Thông tin thêm về các hệ thống kiểu thống nhất được đưa ra bởi các Tour of Scala: Unified Types

+0

Được đánh giá cao. – ilango

+0

Tôi phải lưu ý rằng cũng có [SIP được chấp nhận] (http://docs.scala-lang.org/sips/pending/value-classes.html) sẽ mở ra việc sử dụng các nguyên thủy không có hộp thư với hành vi không mặc định. –

+1

P.S. Và mặc dù tất cả các nguyên thủy JVM được đại diện bởi các kiểu con của 'AnyVal', nghịch đảo là không đúng (' Đơn vị' đã được đề cập). Trong Scala 2.10, bạn có thể mở rộng 'AnyVal', tạo ra cái gọi là [Value-Classes] (http://docs.scala-lang.org/sips/pending/value-classes.html) có nghĩa là cho thực hiện các lớp số mới, hưởng lợi từ việc tối ưu hóa trình biên dịch (ví dụ như nội tuyến). –

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