【问题标题】:method() in x.y.z is defined in an inaccessible class or interfacex.y.z 中的 method() 定义在不可访问的类或接口中
【发布时间】:2018-09-16 13:56:45
【问题描述】:

Super.java

package x.y.z;

public abstract class Super {
  public CustomClass a() {
    return new CustomClass();
  }

  public abstract String getName();
  public abstract String getDescription();
}

Sub.java

package x.y.z;

public abstract class Sub extends Super {
  public String getDescription() {
    return "Is a Sub";
  }
}

User.java

package x.y.z;

public class User {
  private class UseCase extends Sub {
    public String getName() {
      return "UseCase";
    }
  }

  public UseCase use() {
    return new UseCase();
  }
}

在我的应用程序的另一部分,我尝试访问 new User().use().a(),我认为这会导致错误(虽然这是一个编译时错误)。


尝试编译上述错误:

a() in x.y.z.Super is defined in an inaccessible class or interface

是什么导致了这个错误,我该如何解决?


新问题

这让我的错误消失了:

User.java

package x.y.z;

public class User {
  private class UseCase extends Sub {
    public String getName() {
      return "UseCase";
    }
  }

  public Super use() {
    return new UseCase();
  }
}

User.use() 的类型更改为Super“修复”错误。

这是一个有问题的“修复”,还是可以正常工作而不会出现任何问题?

【问题讨论】:

  • 不确定,但从公共方法返回私有内部类可能不是一个好主意。
  • 您使用的是什么 IDE?它为我正常编译,我无法重现该错误。
  • @JacobG。当我尝试在其他地方访问new User().use().a() 时,错误实际上出现了,我正在使用 maven 构建

标签: java oop inheritance abstract-class


【解决方案1】:
a() in x.y.z.Super is defined in an inaccessible class or interface

因为您尝试返回的 UseCase 类是私有的。考虑以下示例,它编译时没有错误:

User user = new User();
Sub sub = user.use(); // because of implicit up-casting to Sub (and Sub is public)
sub.a();

如果要将这 3 行放入单个表达式中,则需要显式转换:

CustomClass custom = ((Sub) new User().use()).a();

此外,正如您已经指出的,您可以将 use(...) 方法的返回类型更改为 SubSuper 类,因此以下代码无需额外的强制转换即可工作:

CustomClass custom = new User().use().a();

【讨论】:

    【解决方案2】:

    这里的问题是您从User#use(即UseCase)返回的类型是privateUser 类,禁止从User 之外的任何地方访问它。将 UseCase 修改为 public 而不是 private 应该可以解决您的问题。

    public class UseCase extends Sub {
        @Override
        public String getName() {
            return "UseCase";
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-27
      • 1970-01-01
      • 2021-02-06
      • 2020-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多