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;
        }
    };;
};;

Бежать:

  1. перейдите в SOME_FOLDER
  2. javac main.java
  3. Ява Майн

Ожидаемый результат:

[Ул]: строка



Вот более ОБЩИЙ пример, показывающий другой вариант использования: мне нравится создавать утилиты, в которых функции помещаются в субконтейнеры, которые помогают распределять пространства имен по различным категориям функций, например:

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]");
        };;
    };;
};;
Другие вопросы по тегам