scalaでjavaクラスを呼び出す
概要
仕事でScalaから別javaを呼び出すときに妙に悩んだのでメモ
以下の3パターンを列挙する
自分の状況
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]$
コンパイルして実行
javaとscalaを個別にコンパイルしたけど、まとめてやる方法があるのかどうかは確認してない
[ludwig125 ScalaJava]$ javac SampleClass.java [ludwig125 ScalaJava]$ scalac useSample.scala [ludwig125 ScalaJava]$ scala useS hoge 8 2 [ludwig125 ScalaJava]$