2013-09-17 2 views
0

Прошу прощения за то, что вы указали ошибку как заголовок, но я не смог найти лучшего заголовка.Метод validate (capture # 2-of? Extends Object) в типе Validator <capture # 2-of? extends Object> не применим для аргументов (String)

У меня есть интерфейс, определенный следующим образом для использования в качестве модели для всех моих классов валидаторов:

public interface Validator<T> { 
    public boolean validate(T item); 
} 

А потом я несколько классов, которые реализуют его, позволяет сказать, один из них заключается в следующем:

public class EmptyStringValidator implements Validator<String> { 
    private final String _errorMessage; 

    public EmptyStringValidator() { 
      this("String cannot be empty."); 
    } 

    public EmptyStringValidator(String message) { 
      this._errorMessage = message; 
    } 

    @Override 
    public String getMessage() { 
      return this._errorMessage; 
    } 

    @Override 
    public boolean validate(String item) { 
      return gsi.application.core.Validation.isEmptyString(item); 
    } 

} 

Я хотел бы поместить все это в массив и назвать все это одним контуром. Так что это код, я использую:

public List<Validator<? extends Object>> validators; 

public FormItem<T> addValidator(Validator<? extends Object> validator) { 
    this.validators.add(validator); 
    return this; 
} 

public boolean validate() { 
    for (Validator<? extends Object> validator : this.validators) 
     if (!validator.validate(this.getInputValue())) { 
      this._errorMessage = validator.getMessage(); 
      return false; 
     } 
    return true; 
} 

Однако, этот код дает ошибку в функции validate(), а именно в этой части:

validator.validate(this.getInputValue()) 

Это дает мне ошибку, что я уже упоминал

The method validate(capture#2-of ? extends Object) in the type Validator<capture#2-of ? extends Object> is not applicable for the arguments (String) 

который, на мой взгляд, не имеет смысла. Насколько я понимаю, <? extends Object> должен принимать все, что происходит от класса Object, правильно?

Может ли кто-нибудь указать, что я делаю неправильно или указать мне в правильном направлении? Спасибо.

+0

'? extends Object' Не имеет смысла. Для всех классов. –

+0

Вот что я подумал, это должно быть верно для каждого класса, который я вложил, но кажется, что он не примет только любой класс. –

+0

Каков тип this.getInputValue() – nitegazer2003

ответ

4

В стороне, ? extends Object ничем не отличается от слова ?. Однако это не корень вашей проблемы.

Вопрос заключается в том, что validators является List<Validator<? extends Object>>. Другими словами, каждый элемент может быть любой вид Validator<T>, не обязательно Validator<String>. Таким образом, вы можете поместить в него Validator<String>, но когда вы вытаскиваете элемент, вы не знаете, что это за Validator, и поэтому вы не знаете, совместим ли он с типом, возвращаемым this.getInputValue().

Простейшим решением было бы указать конкретный тип (например: String) для параметра типа. Более сложным решением было бы использовать переменную типа вместо ? extends Object и использовать сигнатуру типа getInputValue() той же переменной типа. Вам необходимо ограничить типы, чтобы возвращаемый тип getInputValue() присваивался параметру validate().

+0

Прошу прощения, вы меня немного потеряли. По сути, вы говорите, что тип возврата и тип параметра функции в 'getInputValue()' и 'validate' должны быть более расслабленными, например, используя'? extends Object', а не конкретный тип, такой как 'String'. Я правильно понимаю это? –

+0

Нет. Я говорю, что вы, вероятно, хотите сделать наоборот. Вероятно, вы хотите объявить 'validators' как тип' List > 'и' validator' должен иметь тип 'Validator '. –

Смежные вопросы