2015-06-07 13 views
5

Gần đây tôi đã bắt đầu học Scala và cố gắng sử dụng mã Scala của tôi trong Java. Các tệp jar được nhập khẩu hoạt động và bao gồm các lớp và các phương thức của tôi; tuy nhiên, tôi thấy hơi ngạc nhiên khi tôi thấy rằng, trong số các lớp có sẵn để nhập, tôi có thể truy cập cả hai số DiceRollerDiceRoller $ và tôi cũng có thể tiếp cận các phương pháp như attribute_ $ eq trong lớp bình thường .Nhập Scala bằng Java: các lớp và phương thức kỳ lạ hiển thị

DiceRoller được định nghĩa là đối tượng tại Scala, và phần còn lại của các lớp được định nghĩa là lớp, nếu điều đó có thể làm sáng tỏ vấn đề này. Tôi cũng biết lý thuyết cơ bản về các lớp và chức năng ẩn danh, và cách Scala xem xét các hoạt động như các hàm "==", vì vậy đó không phải là quan điểm của tôi, mặc dù nó có thể liên quan.

Khi tôi nhập gói Java, các lớp và phương thức đó không thể truy cập được. Vì vậy, tại sao tôi có thể gọi cho họ khi tôi đang nhập tệp tin Scala jar? Tôi có thể khai báo các lớp và phương thức ẩn danh đó là riêng tư không?

Trả lời

9

JVM không biết gì về Scala. Trình biên dịch Scala phải ánh xạ các cấu trúc Scala tới các cấu trúc JVM theo một cách nào đó.

Ví dụ, JVM không có đối tượng, do đó trình biên dịch Scala ánh xạ đối tượng tới các lớp với một cá thể đơn.

JVM cũng không có các đặc điểm, vì vậy, chúng phải được ánh xạ tới các lớp. (Trên thực tế, việc lập bản đồ các đặc điểm khá phức tạp, trên thực tế, các đặc điểm được ánh xạ tới nhiều lớp.)

Trong Scala, các trường có thể bị ghi đè bởi các phương thức, trong JVM, chúng không thể. Do đó, các trường Scala phải được ánh xạ tới một thứ có thể bị ghi đè bởi các phương thức, đó là các phương thức.

Cũng lưu ý rằng Java IDE của bạn không biết gì về cách Scala mã hóa Scala như cấu trúc JVM. Ví dụ, JVM không biết gì về các lớp ẩn danh, do đó trình biên dịch Java mã hóa các lớp ẩn danh như các lớp được đặt tên thường xuyên với các tên lạ. Các IDE Java biết về các tên lạ và không hiển thị chúng, nhưng các IDE Java không biết về các tên mà trình biên dịch Scala sử dụng.

JVM không biết gì về chức năng. Bây giờ, Java 8 có các hàm hạng nhất, và có một mã hóa chuẩn hóa cho chúng mà các IDE Java hiểu, nhưng Scala có các hàm hạng nhất trước khi Java có chúng, và mã hóa chúng xuất hiện khác với các trình thiết kế Java. nghĩ ra. (Điều này sẽ thay đổi trong các phiên bản tiếp theo của Scala.)

Lưu ý rằng điều tương tự cũng xảy ra với Clojure, Groovy, Python, Ruby, JavaScript, Fantom, Kotlin và tất cả các ngôn ngữ JVM khác. Các công cụ Java đơn giản là không biết về chúng.

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