Skip to content

Package private in Java accessible from subclass in sub packages #11616

Closed
@kynthus

Description

@kynthus

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.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions