12/08/2018, 10:28

Scala interact with Java (vice versa)

Câu hỏi: Câu hỏi 1. Scala có thể tương tác được với Java không? Và ngược lại ? Trong một project Scala có thể vừa chứa file .scala vừa chứa file .java và chúng có thể gọi lẫn nhau không? Câu hỏi 2. Scale sẽ được compile sang bytecode để chạy bởi JVM (Java Virtual Machine). Vậy ta có thể ...

Câu hỏi:

Câu hỏi 1. Scala có thể tương tác được với Java không? Và ngược lại ? Trong một project Scala có thể vừa chứa file .scala vừa chứa file .java và chúng có thể gọi lẫn nhau không?

Câu hỏi 2. Scale sẽ được compile sang bytecode để chạy bởi JVM (Java Virtual Machine). Vậy ta có thể chạy bytecode của Scala bằng Java được không?

Trả lời:

Câu hỏi 1.

  • Scala hoàn toàn có thể tương tác được với Java. Và ngược lại.

  • Trong một Project Scala có thể chứa file .java và sử dụng như một file .scala

  • Trong code Scala vẫn có thể khởi tạo instance của Java và gọi phương thức của Java.

  • Trong code Java vẫn có thể khởi tạo instace của Scala và gọi phương thức của Scala.

  • Scala có thể kế thừa (extends) các class của Java. Và ngược lại.

  • Scala có thể gọi Object của Java Và Java Cũng có thê lảm thế

  • The standard Scala backend chính là JVM (Java Virtual Machine) vậy nên code của Scala và Java đều được thực thi trên JVM.

  • Giới hạn duy nhất giữa em Scala và anh Java đó là có một số tính năng của Scala mà Java không hỗ trợ

    • ví dụ traits

Demo:

Step 1:

  • Tạo mới một Project Scala
  • Trong project bao gồm cả file .scala và .java
  • Sau khi compiled tất cả đều được dịch sang bytecode (.class file)

Screenshot from 2015-07-02 14:09:30.png

new.png

`Step 2:` - tao file Demo.scala (File này chứa hàm main đóng vai trò là EntryPoint của project) - Trong file Scala này ta sẽ khởi tạo một Java instance và sử dụng phương thức của Java. - `var jav = new Jav("This is Java Instance, be called from Scala")` chính là gọi Java từ scala.

demo.png

Step 3

  • Tạo file Sca.scala
  • Chỉ bao gồm một field là name:String
  • Một hàm getter trả lại thuộc tính :name

sca.png

Step 4

  • Tạo file Jav.java
  • Bao gồm một field là name:string, một method getter để trả về name:String.
  • Trong file Java này ta sẽ khởi tạo một instance của Scala và gọi tới phương thức của Scala.
   public String callScala(){
     Sca sca = new Sca();
     return sca.getName();
  }
  /*
  Đây chính là hàm của Java để ta gọi tới Scala.
  */

java.png

Step 5

  • Chạy project, như kết quả bên dưới ta nhận thấy ta vẫn có thể khởi tạo một Java instant trong Scala và sử dụng.

  • Em đã tạo ra 2 file, một là file .scale, hai là file .java và cùng gọi trong một project để ta nhận thấy rõ hơn java và scala có thể tương tác với nhau.

res.png

Câu hỏi 2.

  • scala : dùng để chạy file .scala hoặc file .class sau khi đã compile

  • scalac : dùng để compile file .scala sang mã bytecode (chính là file .class giống như bên Java)

  • java : dùng để chạu file .java hoặc file .class sau khi đã compile sang bytecode

  • javac : dùng để compile file .java sang bytecode

  • Ví dụ : Ta có một file Hello.java

  public class Hello {
    public static void main(String[] args) {
        System.out.println("Hello, World");
    }
}
  • Sau khi chạy javac Hello.java ta sẽ nhận được một file bytecode là Hello.class
  • Lúc này vì triết lý của Java "Viết một lần, chạy mọi nơi" nên ta có thể chạy mã bytecode này trên bất kể nền tảng nào có cài đặt JVM (Java Virtual Machine).
  • Để chạy mã bytecode đã biên dịch ta gõ lệnh : java Hello

Vấn đề

  • Sau khi dùng scalac để compile mã Scala sang mã bytecode ta có thể chạy mã bytecode đó bằng java mà không cần dùng scala không?

Câu trả lời là có :

a.png

  • Ta tạo một file Hello.scala bằng vim có nội dung:
object Hello {
  def main(args: Array[String]) {
    println("Hello, world! I am LeminhTuan, first Scala program. " + args.toList)
  }
}
  • Chạy file Hello.scala

Screenshot from 2015-07-02 16:39:57.png

  • Compile file Hello.scala sang mã bytecode bằng scalac ta sẽ thu được file Hello.class (file Hello.class này chạy bằng JVM)
  • Bình thường ta sẽ chạy file Hello.class này ở bất cứ OS nào hỗ trợ JVM bằng cách: scala Hello

q.png

- Nhưng vì nó đã là mã bytecode nghĩa là JVM có thể hiểu đc vậy ta sẽ chạy nó bằng java và kết quả cũng như chạy bytecode bằng scala

- Chú ý : để chạy được mã scala butecode bằng java trên JVM ta phải sử dụng thư viện scala và có thể download here

- Để dễ dàng sử dụng thư viên này khi chạy java ta sẽ export tro bash

export CLASSPATH=".:/home/leminhtuan/Java/classpath/scala-library-2.10.3.jar"

- Nếu không muốn export thư viện Scala bạn có thể chạy với tham số -cp như hình bên dưới

awq.png

Thanks

This is my first time of check Scala out. So that i have no experience at Scala. Please give me some feedbacks or leave a comment to correct me if i got wrong.

(thankyou)

0