x.y.z中的method()在不可访问的类或接口中定义

时间:2018-04-06 13:56:01

标签: java oop inheritance abstract-class

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“修复了”错误。

这是一个有问题的“修复”,还是会在没有任何打嗝的情况下正常工作?

2 个答案:

答案 0 :(得分:0)

此处的问题是,您从User#use(即UseCase)返回的类型为privateUser,禁止从外部访问该类型User。将UseCase修改为public而不是private可以解决您的问题。

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

答案 1 :(得分:0)

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();