Перегруженная конструкторская неоднозначность - PullRequest
5 голосов
/ 06 апреля 2009

Я пытаюсь использовать перегруженный конструктор в Java, который может принимать либо int[], либо String. Я получаю ошибку компиляции, которая, по-видимому, указывает на то, что в этом вызове конструктора было бы неоднозначно, если бы переменная была null строка или null массив.

Есть ли простой способ обойти это?

Ответы [ 4 ]

16 голосов
/ 06 апреля 2009

Приведите аргумент к одному из типов:

Foo f1 = new Foo((int[]) null);
// or
Foo f2 = new Foo((String) null);
5 голосов
/ 06 апреля 2009

Самый простой способ - избегать null. Если это пустое String, используйте ""; пустой int[] использовать new int[].

Чтобы ответить на вопрос, вы можете использовать приведение или присвоить переменной значение null:

new MyClass((String)null)

final String nullString = null;
new MyClass(nullString)

Первый вариант обычно предпочтителен, если вы собираетесь делать это вообще.

4 голосов
/ 06 апреля 2009

возможно вы можете добавить конструктор без аргументов.

2 голосов
/ 06 апреля 2009

Если у вас есть контроль над классом, который вы хотите создать, рассмотрите возможность использования статического метода фабрики, чтобы вы могли дать им два отдельных имени и избежать путаницы, связанной с перегрузкой.

public static Foo createFromIntArray(final int[] ints) { ... }
public static Foo createFromString(final String str) { ... }

В противном случае, решите, что представляет ваш нуль: это пустой массив целых или пустая строка? Возможно, что класс, который вы создаете, ведет себя по-разному, учитывая один над другим. Как только вы узнаете, что представляет ваш нуль, просто приведите его к этому типу при вызове конструктора.

new Foo((String) null);
new Foo((int[]) null);

Наконец, звучит так, как будто вы передаете объектную ссылку на этот конструктор вместо явного null. Возможно, что-то, что вы получаете от java.util.Map. Если это так, вы можете проверить этот объект с помощью instanceof и привести к соответствующему типу, прежде чем отправлять его соответствующему конструктору.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...