Ho le seguenti classi di esempio in Java:Impossibile chiamare direttamente il costruttore supertipo: perché no?
errorepublic 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
}
}
Il compilatore afferma che gli argomenti non possono essere applicati al costruttore predefinito in Sub, che è perfettamente comprensibile.
Ciò di cui sono curioso è la logica alla base di questa decisione. Java genera il costruttore vuoto predefinito in Sub
; perché non può chiamarlo dietro le quinte in questo caso? Questo è principalmente un caso di sana gestione della mano, o c'è una ragione tecnica?
EDIT
Sono consapevole che questa è una limitazione della lingua. Sono curioso di perché è un limite di lingua.
EDIT 2
Sembra che, come spesso accade, ero troppo vicino al codice che è stato effettivamente lavorando per vedere il quadro generale. Ho pubblicato un contro-esempio nelle risposte qui sotto che mostra perché questa è una cosa cattiva.
Tutto quello che riuscivo a trovare nelle specifiche era che non si poteva fare. Nessuna spiegazione sul perché http://java.sun.com/docs/books/jls/third_edition/html/classes.html#8.2 –
Ecco l'interpretazione di Jon Skeet su http://stackoverflow.com/questions/1644317/java -costruttore-ereditarietà/1644410 # 1644410 –
Sono confuso sulla tua modifica. Vi state chiedendo perché, quando chiamate un costruttore con un argomento, non è possibile chiamare al suo posto un costruttore predefinito senza argomenti? Chiaramente il programmatore non stava cercando di chiamare un costruttore che ignorasse completamente il suo parametro, altrimenti non avrebbe specificato il parametro! –