[英]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.