У меня есть следующий класс:Почему этот метод неоднозначен?
public abstract class AbstractMongoDAO<T extends AbstractChiliEntity> implements IDAO<ObjectId, T> {
// Method 1
protected List<DBObject> getByQuery(Object... pairs) {
DBObject dbobject = //...
return getByQuery(dbobject);
}
// Method 2
protected List<DBObject> getByQuery(Map<String, Object> map) {
DBObject dbobject = //...
return getByQuery(dbobject);
}
// Method 3
protected List<DBObject> getByQuery(DBObject query) {
List<DBObject> dbobjects = //...
return dbobjects;
}
// Inherited methods here - they have nothing at all to do with the methods above.
}
Метод 1 и 2 являются просто разными подходами к построению DBObject, который затем передается в метод 3 для того, чтобы запросить экземпляр MongoDB и возвращает набор результатов.
Компилятор жалуется на оператора возврата метода 1 и 2:
The method getByQuery(Object[]) is ambiguous for the type AbstractMongoDAO<T>
Почему это? Программа компилируется, если я комментирую метод 2. Если я комментирую метод 1, однако, я получаю ту же ошибку компилятора, но вместо метода 2.
Пробовал с моим компилятором, никаких проблем. В методе 2 'dbobjects' должен был быть изменен на' dbobject', но это все. Убедитесь, что ваш пример содержит действительно все, чтобы воспроизвести проблему. О, или сообщите нам версию Java, которую вы используете. Я пробовал 'javac' с Java 6 до 8 и компилятор eclipse с тем же результатом. – Holger
Хольгер прав, нет ничего неправильного в коде, кроме как из неправильного имени переменной в методе 2. С другой стороны, и varargs был введен в java 1.5, и пришлось сделать несколько решений о том, как JVM выбирает метод для выполнения во время выполнения , Вы можете посмотреть, как выбор метода для выполнения выполняется JVM. Посмотрите на http://goo.gl/G7UbGb – nrodriguez
Да, я думаю, что это может быть просто проблема Eclipse ... код выглядел отлично для меня, поэтому, почему я был озадачен ошибками. Я подтвержу, когда вернусь домой. – csvan