[英]Error when converting Java Constructors from Abstract classes and super keyword to C#?
[英]Understanding super keyword for abstract classes
考虑以下课程:
public abstract class AbstractClass {
public abstract String m();
public AbstractClass get(){
return new AbstractClass() {
@Override
public String m() {
return "Anonymous " + super.m(); //1, Compile-time erro
}
};
}
}
目前尚不清楚为何禁止使用super
。 在//1
,发生以下错误
Cannot directly invoke the abstract method m() for the type AbstractClass
所以,我咨询了JLS 15.11.2并没有找到阻止这些代码编译的限制。 他们来了:
如果使用关键字super的表单出现在Object类的声明中,那么这是一个编译时错误,因为Object没有超类。
AbstractClass
的实例,但只有一个具体的子类,以下似乎也是有效的: 使用关键字super的表单仅在实例方法,实例初始值设定项或构造函数中有效,或在类的实例变量的初始值设定项中有效。 如果它们出现在其他任何地方,则会发生编译时错误。
如果当前类不是类T或T本身的内部类,则它是编译时错误。
当然,我可以使用AbstractClass.this.m()
,但这不是我要问的。
super关键字在这里不起作用,因为AbstractClass.m()
已经被声明为abstract,因此在内部类的父级上没有合适的实现。 请记住,内部类不扩展外部类(即使它是相同的类型),它们包含对它的引用。
但是当从内部类调用到外部类(这是我认为你打算在这里做的)时,请使用以下语法AbstractClass.this.m()
。
以下内容将按预期编译和工作。
public abstract class AbstractClass {
public abstract String m();
public AbstractClass get(){
return new AbstractClass() {
@Override
public String m() {
return "Anonymous " + AbstractClass.this.m();
}
};
}
}
据我所知,编译器在使用super.m();
时尝试使用静态绑定super.m();
。 因为没有方法super.m();
由于它是抽象的,编译器已经在编译时抱怨。
Java中的静态绑定意味着在编译期间解析方法,而在运行时使用可被多个子类覆盖的方法时发生动态绑定。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.