1

エラーをそのままタイトルにして申し訳ありませんが、これ以上のタイトルが見つかりませんでした。

すべてのバリデータークラスの青写真として使用するために、次のように定義されたインターフェースがあります。

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

そして、それを実装するクラスがいくつかあります。そのうちの1つがこれだとしましょう:

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);
    }

}

すべてを配列に入れて、すべてを1つのループで呼び出したいと思います。これは私が使用しているコードです:

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 クラスから派生したものは何でも受け入れるべきですよね?

誰かが私が間違っていることを指摘したり、正しい方向に向けたりすることはできますか? ありがとう。

4

2 に答える 2

5

余談? extends Objectですが、言うことと変わりません?。ただし、それは問題の根本ではありません。

問題は、それvalidatorsList<Validator<? extends Object>>. つまり、各要素は任意の種類の にすることができValidator<T>、必ずしも である必要はありませんValidator<String>。したがって、 a をそれに入れることはできますがValidator<String>、要素を引き出すと、Validatorそれがどのようなものかがわからないため、 によって返される型と互換性があるかどうかわかりませんthis.getInputValue()

String最も簡単な修正は、型パラメーターに具体的な型 (例: ) を指定することです。より複雑な修正は、 の代わりに型変数を使用し、? extends ObjectgetInputValue()型シグネチャで同じ型変数を使用することです。getInputValue()の戻り値の型が のパラメータに割り当て可能になるように、型を制約する必要がありますvalidate()

于 2013-09-17T06:03:15.507 に答える