Scala 3のIArrayはJavaから見たらただの配列なのでArrayStoreException発生させることが可能

タイトルでほぼ全部言い切ってるシリーズ。

以下、それ用のコード

B.java

package example;

class B {
  // JDK 25だよ
  void main() {
    var a = new A();
    var array = a.f();
    array[0] = Integer.valueOf(2);
  }
}

A.scala

package example

class A {
  def f: IArray[AnyRef] = IArray("a")
}

build.sbt

scalaVersion := "3.7.4"

実行結果

[info] running example.B 
[error] java.lang.ArrayStoreException: java.lang.Integer
[error]     at example.B.main(B.java:7)
[error]     at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104)
[error]     at java.base/java.lang.reflect.Method.invoke(Method.java:565)

scala.IArray に限らずopaque typeは他のJVM言語から見たら中身がそのまま見れてしまうはずなので、

Scala以外の言語から使われる可能性のあるライブラリ作成時などに、IArray含めたopaque typeをpublicなシグネチャに使う時は気をつけましょう。