![](/img/trans.png)
[英]Java Generics :The method compareTo(capture#2-of ? extends E) in the type Comparable is not applicable for the arguments (Comparable)
[英]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
與說法沒有什么不同?
。 但是,這不是問題的根源。
問題是validators
是List<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.