不能直接调用超类型构造函数 - 为什么不呢?

aro*_*eer 6 java constructor

我在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®.

Mar*_*ers 2

我认为这是一个可读性和不假设意图的问题。你说

Java生成默认的空构造函数;为什么在这种情况下它不能在幕后调用它?

Super(A)然而对我来说,对于 Java 来说,“在幕后”隐式调用构造函数比直接调用构造函数更有意义Super(),而忽略A.

现在你就得到了它。对于这种情况下 应该(或可能)发生什么,我们已经有两个不同的假设。

Java 语言的核心原则之一是透明性。程序员应该尽可能地通过查看代码来了解会发生什么,有时会牺牲语法级别的便利性或魔力。

与此并行的原则是不假设意图:在程序员的意图似乎不明确的情况下,Java 语言有时会倾向于编译错误,而不是通过某种(任意或其他)选择算法自动选择默认值。