Дан следующий код:
public class MyClass
{
public MyClass(Object o)
{
System.out.println("Object");
}
public MyClass(double[] a)
{
System.out.println("double array");
}
public static void main(String[] args)
{
new MyClass(null);
}
}
Вопрос: какой констуктор будет вызван в методе main?
На первый взгляд, подходят оба конструктора, так как значение null годится как для Object, так и для double[]. Один из возможных вариантов ответа: произойдет ошибка компиляции. Но это не так. Будет вызван конструктор
public MyClass(double[] a)
Почему?
В Java Language Specification (JLS) есть раздел, освещающий выбор перегруженного метода. Вызывается наиболее специфичный метод. Каждый массив в Java является Object, но не каждый Object является массивом. Конструктор MyClass(Object) принимает любой параметр, переданный конструктору MyClass(double[]). Поэтому наиболее специфичным методом (конструктором) является MyClass(double[]).
Для того, чтобы вызвать конструктор MyClass(Object) при передачи нулевой ссылки (null), следует явно привести null к типу Object:
new MyClass((Object)null);
Конечно, вместо конструкторов можно использовать паттерн фабричный метод, создав публичные статические методы, а все конструкторы объявить private.
Комментариев нет:
Отправить комментарий