Какой конструктор выбирается при передаче null? - PullRequest
7 голосов
/ 26 октября 2010

В следующем примере у меня есть 2 конструктора: один, который принимает строку, а другой - пользовательский объект.Для этого пользовательского объекта существует метод "getId ()", который возвращает строку.

public class ConstructorTest {
 private String property;

 public ConstructorTest(AnObject property) {
  this.property = property.getId();
 }

 public ConstructorTest(String property) {
  this.property = property;
 }

 public String getQueryString() {
  return "IN_FOLDER('" + property + "')";
 }
}

Если я передам null конструктору, какой конструктор будет выбран и почему?В моем тесте выбран конструктор String, но я не знаю, так ли это всегда и почему.

Я надеюсь, что кто-то может дать мне некоторое представление об этом.

Спасибо завперед.

Ответы [ 3 ]

15 голосов
/ 26 октября 2010

Делая это:

ConstructorTest test = new ConstructorTest(null);

Компилятор будет жаловаться, заявив:

Конструктор ConstructorTest (AnObject) является неоднозначным.

JVM не может выбрать, какой конструктор вызывать, поскольку не может определить тип, соответствующий конструктору (см .: 15.12.2.5 Выбор наиболее определенного метода ).

Вы можете вызвать specific конструктор путем типизации параметра, например:

ConstructorTest test = new ConstructorTest((String)null);

или

ConstructorTest test = new ConstructorTest((AnObject)null);

Обновление: Благодаря @OneWorld, соответствующая ссылка (до даты ввремя написания) можно получить доступ здесь .

3 голосов
/ 26 октября 2010

Компилятор выдаст ошибку.

0 голосов
/ 26 октября 2010

Java использует самый специфический конструктор, который он может найти в соответствии с аргументами.PS: если вы добавите конструктор (InputStream), компилятор выдаст ошибку из-за неоднозначности - он не может знать, что более конкретно: String или InputStream, поскольку они находятся в другой иерархии классов.

...