我在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
}
}
編譯器錯誤指出的論點不能應用到子默認的構造函數,這是完全可以理解的。
我很好奇這個決定背後的基本原理。 Java在Sub
中生成默認的空構造函數;爲什麼不能在這種情況下在幕後調用它?這主要是一個理智的手持情況,還是有技術上的原因?
編輯
我知道是這是一個語言的限制。我很好奇爲什麼這是一種語言限制。
EDIT 2
看來,這是常有的情況下,我是太接近我實際工作中看到大圖片的代碼。我在下面的答案中發佈了一個反例,說明爲什麼這是一件壞事。
我在規範中找到的所有東西都是無法完成的。沒有解釋爲什麼http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.2 –
這是Jon Skeet的承擔http://stackoverflow.com/questions/1644317/java -constructor-inheritance/1644410#1644410 –
我對你的編輯感到困惑。你想知道爲什麼當你用一個參數調用構造函數時,沒有參數的默認構造函數不能被調用?顯然,程序員並沒有試圖調用一個完全忽略他的參數的構造函數,否則他不會指定參數! –