Closed
Description
Compiler version
3.0.0-RC1 with Java SE Development Kit 8u202
Minimized code
// pkg/A.java
package pkg;
public class A {
protected void fn1() { System.out.println("A#fn1()"); }
void fn2() { System.out.println("A#fn2()"); }
}
// pkg/sub/B.scala
package pkg.sub
import pkg.A
class B extends A {
def test(): Unit = {
super.fn1()
super.fn2() // java.lang.IllegalAccessError
val b: B = new B()
b.fn1()
b.fn2() // Same as `super.fn2()`.
}
}
Output
pkg/sub/B.scala
is compile successfully.
# scalac -version
Scala compiler version 3.0.0-RC1 -- Copyright 2002-2021, LAMP/EPFL
# javac pkg/A.java
# scalac pkg/sub/B.scala
But, I get an java.lang.IllegalAccessError
when call the B#test()
.
import pkg.sub.B
val b: B = new B()
scala> b.test()
A#fn1()
java.lang.IllegalAccessError: tried to access method pkg.A.fn2()V from class pkg.sub.B
at pkg.sub.B.test(B.scala:11)
... 27 elided
Scala 2 will detect it with a compile error.
# scalac -version
Scala compiler version 2.13.5 -- Copyright 2002-2020, LAMP/EPFL and Lightbend, Inc.
# javac pkg/A.java
# scalac pkg/sub/B.scala
pkg/sub/B.scala:11: error: method fn2 in class A cannot be accessed as a member of pkg.A from class B in package sub
super.fn2() // OK but I was surprised, package private member in Java is invisible to subpackages.
^
pkg/sub/B.scala:15: error: method fn2 in class A cannot be accessed as a member of pkg.sub.B from class B in package sub
b.fn2() // Same as `super.fn2()`.
^
2 errors
However, it seems that Scala 2.8.0 and earlier could be compiled(with Java SE Development Kit 5.0u22).
# scalac -version
Scala compiler version 2.8.0.final -- Copyright 2002-2010, LAMP/EPFL
# javac pkg/A.java
# scalac pkg/sub/B.scala
Even older versions will throw an java.lang.IllegalAccessError
as well when run.
It's like an ancient demon revived.
Expectation
I think it's better to have a compile error in Scala 3 as well.