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
“修复了”错误。
这是一个有问题的“修复”,还是会在没有任何打嗝的情况下正常工作?
答案 0 :(得分:0)
此处的问题是,您从User#use
(即UseCase
)返回的类型为private
类User
,禁止从外部访问该类型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(...)
方法返回类型更改为Sub
或Super
类,因此以下代码无需额外演员:
CustomClass custom = new User().use().a();