вторник, 18 сентября 2007 г.

Java Puzzle 46: The Case of the Confusing Constructor

Что делает следующая программа?
public class Confusing {
    private Confusing(Object object) {
        System.out.println("Object!");
    }
    private Confusing(double[] array) {
        System.out.println("Array!");
    }
    public static void main(String[] args) {
        new Confusing(null);
    }
}
Это вопрос по спецификации. Первый из раздела "классические головоломки". Программа скомпилируется и выполнится конструктор, напечатающий Array. В приведенном выше примере оба конструктора можно вызвать, но по спецификации выбирается тот, который более конкретный. Это второй конструктор, так как каждый массив - это объект, но не каждый объект - массив. Для принудительного вызова необходимого конструктора нужно привести аргументы к типу, определенному в списке формальных параметров:
    public static void main(String[] args) {
        new Confusing((Object) null);
    }
Обратите внимание, что если поменять тип первого конструктора в примере на Double (например), то программа не скомпилируется. В идеале, лучше избегать перегрузки конструкторов и методов.

Комментариев нет:

Отправить комментарий