我在Java中有以下示例类:
public class A { }
public class Super {
protected Super() { }
public Super(A a) { }
}
public class Sub extends Super { }
public class Consumer {
public Consumer() {
Sub sub = new Sub(new A()); //compiler error
}
}
Run Code Online (Sandbox Code Playgroud)
编译器错误表明参数不能应用于Sub中的默认构造函数,这是完全可以理解的.
我很好奇的是这个决定背后的理由.Java生成默认的空构造函数Sub; 为什么不能在这种情况下在幕后调用呢?这主要是理智的手持,还是有技术原因?
编辑
我知道的是这是一个语言的限制.我很好奇为什么它是一种语言限制.
编辑2
看起来,通常情况下,我太过接近我实际工作的代码,看看大局.我在下面的答案中发布了一个反例,说明了为什么这是BadThing®.
我认为这是一个可读性和不假设意图的问题。你说
Java生成默认的空构造函数;为什么在这种情况下它不能在幕后调用它?
Super(A)然而对我来说,对于 Java 来说,“在幕后”隐式调用构造函数比直接调用构造函数更有意义Super(),而忽略A.
现在你就得到了它。对于这种情况下 应该(或可能)发生什么,我们已经有两个不同的假设。
Java 语言的核心原则之一是透明性。程序员应该尽可能地通过查看代码来了解会发生什么,有时会牺牲语法级别的便利性或魔力。
与此并行的原则是不假设意图:在程序员的意图似乎不明确的情况下,Java 语言有时会倾向于编译错误,而不是通过某种(任意或其他)选择算法自动选择默认值。