2017-02-23 136 views
-1

請找到下面的代碼片段: 階級統治訪問私有內部類中重寫的方法與私有構造

public class Rules { 

    public static final JarvisFilterRule FILTER = new JarvisFilterRule(); 

    private static class JarvisFilterRule extends RelOptRule { 
     private JarvisFilterRule() { 
      super(operand(Filter.class, operand(Query.class, none()))); 
     } 

     public void onMatch(RelOptRuleCall call) { 
     // do something 
     } 
    } 
} 

類RelOptRule

public abstract class RelOptRule { 

    /** 
    * Description of rule, must be unique within planner. Default is the name 
    * of the class sans package name, but derived classes are encouraged to 
    * override. 
    */ 
    protected final String description; 
    public abstract void onMatch(RelOptRuleCall call); 
} 

我的問題是:哪有我訪問嵌套類Rules.JarvisFilterRule的onMatch()方法?

+0

'onMatch'方法是一個_instance_方法,所以你不能「訪問內部_class_」的onMatch()方法。您可以在由常量「FILTER」引用的新JarvisFilterRule實例上調用該方法。只需調用'Rules.FILTER.onMatch(...)'。除此之外,你的代碼不能編譯,你的問題很不明確。 – Seelenvirtuose

+0

直到Rules.FILTER,我沒有得到任何錯誤。但是當我調用Rules.FILTER.onMatch(..)時,我得到一個編譯錯誤「類型Rules.JarvisFilterRule不可見」。 –

回答

0

private關鍵字的目的是爲了防止訪問需要由聲明它的類專門使用的類成員。

在你的情況下,Rules類定義JarvisFilterRule是有意向,其實施應僅已知Rulesprivate內部類。

如果您希望訪問在另一個類中的方法JarvisFilterRule::onMatch(),你將需要public更換private改性劑JarvisFilterRule或內部類JarvisFilterRule移動到自己單獨的文件,並使其成爲public類。就像這樣:

JarvisFilterRule的.java

public class JarvisFilterRule extends RelOptRule { 
     public JarvisFilterRule() { 
      super(operand(Filter.class, operand(Query.class, none()))); 
     } 

     public void onMatch(RelOptRuleCall call) { 
     // do something 
     } 
    } 

- 或 -

public class Rules { 

    public static final JarvisFilterRule FILTER = new JarvisFilterRule(); 

    public static class JarvisFilterRule extends RelOptRule { 
     private JarvisFilterRule() { 
      super(operand(Filter.class, operand(Query.class, none()))); 
     } 

     public void onMatch(RelOptRuleCall call) { 
     // do something 
     } 
    } 
} 

希望這有助於!

0

Rules.FILTER.onMatch(...)

JarvisFilterRule不是一個內部類。 Java中的內部類是非靜態的嵌套類。

+0

感謝您指出它。糾正。 –