簡體   English   中英

驗證器類型中的方法validate(capture#2-of?extended Object) <capture#2-of ? extends Object> 不適用於參數(字符串)

[英]The method validate(capture#2-of ? extends Object) in the type Validator<capture#2-of ? extends Object> is not applicable for the arguments (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> <? extends Object>應該接受從Object類派生的任何內容,對嗎?

有人可以指出我做錯了什么,還是指出正確的方向? 謝謝。

順便說一句, ? extends Object ? extends Object與說法沒有什么不同? 但是,這不是問題的根源。

問題是validatorsList<Validator<? extends Object>> List<Validator<? extends Object>> 換句話說,每個元素可以是任何種類的Validator<T> ,不一定是Validator<String> 因此,您可以將Validator<String>放入其中,但是當您拉出一個元素時,您不知道它是哪種Validator ,因此也不知道它是否與此this.getInputValue()返回的類型兼容。 this.getInputValue()

最簡單的解決方法是為type參數指定一種具體的類型(例如: String )。 更復雜的解決方法是使用類型變量代替? extends Object ? extends Object ,並讓getInputValue()的類型簽名使用相同的類型變量。 您需要限制類型,以便getInputValue()的返回類型可分配給validate()的參數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM