【问题标题】:x in y is defined in an inaccessible class or interface, ID in structurex in y 定义在不可访问的类或接口中,ID 在结构中
【发布时间】:2014-02-27 11:05:45
【问题描述】:

我收到了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;
  }
}

【问题讨论】:

    标签: java java-7 public access-specifier


    【解决方案1】:

    如果你想从不同的包中访问某些东西,它必须是public

    【讨论】:

    • 所以我真的要新建一个类文件吗?
    • @DanielRuf 如果类文件是指.java 源文件,那么是的。每个.java 文件只能有一个公共类/接口。
    • @Pshemo 似乎 Java (OOP) 比 C++ 更严格,代码是(自动)转换的 C++ 项目的一部分
    【解决方案2】:

    您将无法访问另一个包中的 protectedprivate 的任何内容。他们必须是public

    【讨论】:

    • 您忘记了默认访问修饰符(没有访问修饰符编写),这似乎是这里的问题。
    【解决方案3】:

    @DanielRuf,您不必创建新的类文件。 您可以使用嵌套类。我已将您的代码固定为可运行的示例。

    您的 FIXED 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 );
        };;
    };;
    

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

    运行:

    1. cd 到 SOME_FOLDER
    2. javac main.java
    3. java 主程序

    预期输出:

    [str]:字符串



    这是一个更GENERAL的例子,展示了另一个用例: 我喜欢创建将函数放入子容器的实用程序 这有助于命名不同类别的函数,如下所示:

    MyStaticUtil.pkg_var.sayHello();

    某些功能按放入的分类 类文件中可公开访问的辅助对象, 以下是你的做法:

    我们的 Runner 类:(两个示例相同):

    import pkg.MyStaticUtil;
    public class RunMe{
        public static void main( String  []  args ){
            MyStaticUtil.getPkgVar().sayHello();
            MyStaticUtil.pkg_var.sayHello();
        };;
    };;
    

    错误代码:


    错误:PackageClass 中的 sayHello() 定义在不可访问的类中 或接口

    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]");
            };;
        };;
    };;
    

    【讨论】:

      猜你喜欢
      • 2018-09-16
      • 1970-01-01
      • 1970-01-01
      • 2022-09-22
      • 1970-01-01
      • 1970-01-01
      • 2021-02-06
      • 1970-01-01
      • 2018-01-13
      相关资源
      最近更新 更多