x в y определен в недоступном классе или интерфейсе, идентификатор в структуре
Я получаю main.java: error: someId in someStruct is defined in an inaccessible class or interface
но как я могу решить это?
мой основной класс:
import subdir.Subclass;
public class main{
...
Subclass.someArrayList.get(i).someString
...
}
мой subdir.Subclass класс:
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;
}
}
3 ответа
Если вы хотите получить доступ к чему-либо из другого пакета, это должно быть public
,
Вы не сможете получить доступ к чему-либо, что protected
или же private
в другой упаковке. Они должны быть public
,
@DanielRuf, вам не нужно создавать новый файл класса. Вы можете использовать вложенный класс. Я исправил ваш код в работоспособном примере.
Ваш ИСПРАВЛЕННЫЙ SOME_FOLDER/main.java: Этот файл на самом деле не важная часть, но здесь для полноты.
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 );
};;
};;
Ваш ИСПРАВЛЕННЫЙ 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;
}
};;
};;
Бежать:
- перейдите в SOME_FOLDER
- javac main.java
- Ява Майн
Ожидаемый результат:
[Ул]: строка
Вот более ОБЩИЙ пример, показывающий другой вариант использования: мне нравится создавать утилиты, в которых функции помещаются в субконтейнеры, которые помогают распределять пространства имен по различным категориям функций, например:
MyStaticUtil.pkg_var.sayHello ();
Где некоторые функции классифицируются путем помещения их в общедоступные вспомогательные объекты в файле класса, вот как вы это сделаете:
Наш класс бегунов: (одинаковый в обоих примерах):
import pkg.MyStaticUtil;
public class RunMe{
public static void main( String [] args ){
MyStaticUtil.getPkgVar().sayHello();
MyStaticUtil.pkg_var.sayHello();
};;
};;
НЕПРАВИЛЬНЫЙ КОД:
ошибка: sayHello() в PackageClass определен в недоступном классе или интерфейсе
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]");
};;
};;
ПРАВИЛЬНЫЙ:
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]");
};;
};;
};;