[英]How do I execute the function public method declared inside a class which is in turn inside a private method?
所以,我想执行以下代码块的 sum():
import java.lang.reflect.Method;
public class LocalOuterClass { // start of outer
private int x = 10;
private Object run() { //start of inner
class LocalInnerClass {
private int y = 20;
public void sum() {
System.out.println(x+y);
}
} //end of inner
LocalInnerClass lc = new LocalInnerClass();
//lc.sum();
return lc;
}
public static void main(String[] args) {
LocalOuterClass Loc = new LocalOuterClass();
Object obj = Loc.run();
System.out.println(obj.getClass());
Method[] methods = obj.getClass().getMethods();
for (Method method : methods) {
String MethodName = method.getName();
System.out.println("Name of the method: "+ MethodName);
}
}
} //end of outer
当我执行 lc.sum() 时,正确执行 sum()。 但是当我将内部类的对象返回给 main() 并尝试执行 sum() 时,它会给出编译器错误。 在对象上执行 getClass().getMethods() 确实将 sum() 作为方法之一打印。 我应该怎么做才能在 main() 中执行 sum()?
您必须将返回类型更改为LocalInnerClass
并将LocalInnerClass
移出方法:
public class LocalOuterClass {
private int x = 10;
private class LocalInnerClass {
private int y = 20;
public void sum() {
System.out.println(x + y);
}
}
private LocalInnerClass run() {
LocalInnerClass lc = new LocalInnerClass();
//lc.sum();
return lc;
}
public static void main(String[] args) {
LocalOuterClass Loc = new LocalOuterClass();
LocalInnerClass obj = Loc.run();
obj.sum(); // it works!
// ...
}
}
问题是,您的main
方法不知道整个LocalInnerClass
。 如果整个类型未知,它没有帮助,它有一个公共方法。 你需要重构你的代码才能改变它。
实际上,您的方法run
当前返回一个Object
类型的值,您需要返回一个LocalInnerClass
类型的值,但是由于类型可见性,这是不可能的。
您基本上有两种选择。 一种是将整个LocalInnerClass
移动到main
可见的位置(如 oleg.cherednik 建议的那样):
class LocalOuterClass {
private int x = 10;
private LocalInnerClass run() { // now we can retun `LocalInnerClass`
return new LocalInnerClass();
}
public static void main(String[] args) {
new LocalOuterClass().run().sum(); // works!
}
private class LocalInnerClass {
private int y = 20;
public void sum() {
System.out.println(x+y);
}
}
}
另一种选择是实现/扩展具有sum
的不同类型,例如:
class LocalOuterClass {
private int x = 10;
private Summable run() { //start of inner
class LocalInnerClass implements Summable {
private int y = 20;
public void sum() {
System.out.println(x+y);
}
}
return new LocalInnerClass();
}
public static void main(String[] args) {
new LocalOuterClass().run().sum(); // works as well
}
private interface Summable {
void sum();
}
}
使用此接口选项,类型LocalInnerClass
仍然对您的run
方法之外的任何人不可见,但是Summable
是,并且由于您的LocalInnerClass
实现了Summable
您可以返回该类型的值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.