Skip to content

Instantly share code, notes, and snippets.

@travisbrown
Created February 2, 2016 18:48
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save travisbrown/b9c01e0f40e05cf0427d to your computer and use it in GitHub Desktop.
Save travisbrown/b9c01e0f40e05cf0427d to your computer and use it in GitHub Desktop.
Package private types in your public API
// src/main/java/j/bar/Bar.java
package j.bar;
abstract class Foo {
public abstract String value();
}
public class Bar {
public static Foo makeFoo() {
return new Foo() {
public String value() {
return "whatever";
}
};
}
}
// src/main/java/j/CallJava.java
package j;
public class CallJava {
public static void main(String[] args) {
/**
* The following line would fail with:
* j/qux/Qux.java:5: error: value() in Foo is defined in an inaccessible class or interface
* System.out.println(j.bar.Bar.makeFoo().value());
* ^
*/
//System.out.println(j.bar.Bar.makeFoo().value());
}
}
// src/main/java/j/CallScala.java
package j;
public class CallScala {
public static void main(String[] args) {
System.out.println(s.bar.Bar.makeFoo().value());
}
}
// src/main/scala/Demo.scala
package s
object CallScala {
def main(args: Array[String]): Unit = println(s.bar.Bar.makeFoo.value)
}
object CallJava {
def main(args: Array[String]): Unit = println(j.bar.Bar.makeFoo.value)
}
package bar {
private[bar] abstract class Foo {
def value: String
}
object Bar {
def makeFoo: Foo = new Foo {
def value = "whatever"
}
}
}
@travisbrown
Copy link
Author

> runMain j.CallScala
[info] Running j.CallScala 
whatever
[success] Total time: 0 s, completed Feb 2, 2016 12:49:56 PM
> runMain s.CallScala
[info] Running s.CallScala 
whatever
[success] Total time: 0 s, completed Feb 2, 2016 12:49:59 PM
> runMain s.CallJava
[info] Running s.CallJava 
[error] (run-main-3) java.lang.IllegalAccessError: tried to access class j.bar.Foo from class s.CallJava$
java.lang.IllegalAccessError: tried to access class j.bar.Foo from class s.CallJava$
        at s.CallJava$.main(Demo.scala:9)
        at s.CallJava.main(Demo.scala)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:497)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment