ludwig125のブログ

頑張りすぎずに頑張る父

scalaでjavaクラスを呼び出す

概要

仕事でScalaから別javaを呼び出すときに妙に悩んだのでメモ

以下の3パターンを列挙する

自分の状況

  • scalaよくわかってない
  • java全然しらない

javaからjavaを使う

javaの場合はclass名とファイル名が同じでないといけないらしい

以下のファイルを用意する

[ludwig125 JavaJava]$ cat SampleClass.java
public class SampleClass {
        public static String val = "hoge";

    public static int add(int x, int y) {
        return x + y;
    }
    public static int sub(int x, int y) {
        return x - y;
    }
}
[ludwig125 JavaJava]$
[ludwig125 JavaJava]$ cat useSample.java
public class useSample {
    public static void main(String[] args) {

        System.out.println(SampleClass.val);
        System.out.println(SampleClass.add(5, 3));
        System.out.println(SampleClass.sub(5, 3));
    }
}
[ludwig125 JavaJava]$

コンパイルして実行

[ludwig125 JavaJava]$ javac SampleClass.java useSample.java
[ludwig125 JavaJava]$ java useSample
hoge
8
2
[ludwig125 JavaJava]$

scalaからscalaを使う

以下のファイルを用意する

[ludwig125 ScalaScala]$ cat SampleClass.scala
class S {
  val v = "hoge"
  def add(a: Int, b: Int): Int = a + b
  def sub(a: Int, b: Int): Int = a - b
}
[ludwig125 ScalaScala]$
[ludwig125 ScalaScala]$ cat useSample.scala
object useS {
  def main(args: Array[String]): Unit = {
    val s = new S
    println(s.v)
    println(s.add(5, 3))
    println(s.sub(5, 3))
  }
}
[ludwig125 ScalaScala]$

コンパイルして実行

[ludwig125 ScalaScala]$ scalac SampleClass.scala useSample.scala
[ludwig125 ScalaScala]$ scala useS
hoge
8
2
[ludwig125 ScalaScala]$

特記事項

scalaの場合javaと違ってファイル名とクラス名を一致させる必要はない 「val」がscalaの予約後なのでvに変えたが、valのまま使う方法もあったはず

scalaの場合、scalacでファイル名を指定してコンパイルしたあと、scalaコマンドの実行対象はクラス名(この場合useS)であることに注意

scalaからjavaを使う

以下のファイルを用意する

[ludwig125 ScalaJava]$ cat SampleClass.java
public class SampleClass {
        public static String v = "hoge";

    public static int add(int x, int y) {
        return x + y;
    }
    public static int sub(int x, int y) {
        return x - y;
    }
}
[ludwig125 ScalaJava]$
[ludwig125 ScalaJava]$ cat useSample.scala
object useS {
  def main(args: Array[String]): Unit = {
    println(SampleClass.v)
    println(SampleClass.add(5, 3))
    println(SampleClass.sub(5, 3))
  }
}
[ludwig125 ScalaJava]$

コンパイルして実行

javascalaを個別にコンパイルしたけど、まとめてやる方法があるのかどうかは確認してない

[ludwig125 ScalaJava]$ javac SampleClass.java
[ludwig125 ScalaJava]$ scalac useSample.scala
[ludwig125 ScalaJava]$ scala useS
hoge
8
2
[ludwig125 ScalaJava]$