タイトルでほぼ全部言い切ってるシリーズ。
以下、それ用のコード
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なシグネチャに使う時は気をつけましょう。