访问私有内部类中重写的方法与私有构造
问题描述:
请找到下面的代码片段: 阶级统治访问私有内部类中重写的方法与私有构造
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()方法?
答
private
关键字的目的是为了防止访问需要由声明它的类专门使用的类成员。
在你的情况下,Rules
类定义JarvisFilterRule
是有意向,其实施应仅已知Rules
类private
内部类。
如果您希望访问在另一个类中的方法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
}
}
}
希望这有助于!
答
Rules.FILTER.onMatch(...)
JarvisFilterRule
不是一个内部类。 Java中的内部类是非静态的嵌套类。
+0
感谢您指出它。纠正。 –
'onMatch'方法是一个_instance_方法,所以你不能“访问内部_class_”的onMatch()方法。您可以在由常量“FILTER”引用的新JarvisFilterRule实例上调用该方法。只需调用'Rules.FILTER.onMatch(...)'。除此之外,你的代码不能编译,你的问题很不明确。 – Seelenvirtuose
直到Rules.FILTER,我没有得到任何错误。但是当我调用Rules.FILTER.onMatch(..)时,我得到一个编译错误“类型Rules.JarvisFilterRule不可见”。 –