If you want to access something from a different package, it must be public
.
x in y is defined in an inaccessible class or interface, ID in structure
-
06-10-2022 - |
Question
I am getting main.java: error: someId in someStruct is defined in an inaccessible class or interface
but how can I solve this?
my main class:
import subdir.Subclass;
public class main{
...
Subclass.someArrayList.get(i).someString
...
}
my subdir.Subclass class:
package subdir;
public class Subclass{
public static java.util.ArrayList<someStruct> someArrayList = new java.util.ArrayList<someStruct>(java.util.Arrays.asList(
new someStruct(3, "string", "string"),
new someStruct(4, "string", "string")
));
}
class someStruct
{
public int someId;
public String someString;
public String someString2;
public someStruct(int someId, String someString, String someString2) {
this.someId = someId;
this.someString = someString;
this.someString2 = someString2;
}
}
Solution
OTHER TIPS
You will not be able to access anything that is protected
or private
in another package. They must be public
.
@DanielRuf, you don't have to create a new class file. You can use a nested class. I have fixed your code into a runnable example.
Your FIXED SOME_FOLDER/main.java: This file isn't really the important part, but here for completeness.
import subdir.Subclass;
public class main{
public static void main( String [] args ){
String
str=(
Subclass
.someArrayList
.get( 0 ) //:<--Hardcoded for example
.someString
);;
System.out.println( "[str]:"+str );
};;
};;
Your FIXED SOME_FOLDER/subdir/Subclass.java:
package subdir;
public class Subclass{
public static java.util.ArrayList<someStruct>
someArrayList = new java.util.ArrayList<someStruct>(
java.util.Arrays.asList(
new someStruct(3, "string", "string"),
new someStruct(4, "string", "string")
)
);;
public static class someStruct
{
public int someId ;
public String someString ;
public String someString2;
public someStruct(
int someId
,String someString
,String someString2
){
this.someId = someId ;
this.someString = someString ;
this.someString2 = someString2;
}
};;
};;
To Run:
- cd into SOME_FOLDER
- javac main.java
- java main
Expected Output:
[str]:string
Here is a more GENERAL example showing another use-case: I like to create utilities where functions are put into sub-containers that help to namespace out different categories of functions like so:
MyStaticUtil.pkg_var.sayHello();
Where some functions are categorized by being put into publically accessible helper objects in the class file, here is how you would do it:
Our Runner Class: (Same in Both Examples):
import pkg.MyStaticUtil;
public class RunMe{
public static void main( String [] args ){
MyStaticUtil.getPkgVar().sayHello();
MyStaticUtil.pkg_var.sayHello();
};;
};;
WRONG CODE:
error: sayHello() in PackageClass is defined in an inaccessible class or interface
package pkg;
public class
MyStaticUtil{
public static PackageClass
pkg_var = new PackageClass();
public static PackageClass
getPkgVar(){
return( MyStaticUtil.pkg_var );
};;
};;
class //:<<<<<<<<<<<<<<<<<<<<<<<<<<<<INACCESSIBLE
PackageClass{
public static void
sayHello(){
System.out.println("[Hello]");
};;
};;
CORRECT:
package pkg;
public class
MyStaticUtil{
final public static PackageClass //:<--Final so component cannot be
pkg_var = new PackageClass(); //: "beheaded" (de-referenced/set to null)
public static PackageClass
getPkgVar(){
return( MyStaticUtil.pkg_var );
};;
public static class //:Accessible and not
PackageClass{ //:required to be declared in another file.
public static void
sayHello(){
System.out.println("[Hello]");
};;
};;
};;