我有以下 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
}
}
编译器错误指出参数不能应用于 Sub 中的默认构造函数,这是完全可以理解的。
我很好奇的是这个决定背后的理由。 Java在Sub
中生成默认的空构造函数;为什么在这种情况下不能在幕后调用它?这主要是理智的手持情况,还是有技术原因?
编辑
我知道这是语言限制。我很好奇为什么这是语言限制。
编辑 2
似乎,就像通常的情况一样,我离实际工作的代码太近了,看不到全局。我在下面的答案中发布了一个反例,说明了为什么这是一件坏事®。
最佳答案
我认为这是一个可读性和不假设意图的问题。你说
Java generates the default empty constructor; why can't it call it behind the scenes in this case?
但对我来说,Java 在“幕后”隐式调用 Super(A)
构造函数比调用 Super()
更有意义构造函数,忽略 A
。
就是这样。对于在这种情况下应该(或可能)发生什么,我们已经有两个不同的假设。
Java 语言的核心原则之一是透明性。程序员应该尽可能地通过查看代码来了解会发生什么,有时会牺牲语法级别的便利性或魔力。
与此平行的原则是不假设意图:在程序员的意图似乎模棱两可的情况下,Java 语言有时会倾向于编译错误,而不是通过某种(任意或其他)选择算法自动选择默认值。
关于java - 不能直接调用父类(super class)型构造函数——为什么不呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7884171/