web-dev-qa-db-ja.com

クラスは生の型です。ジェネリック型Class <T>への参照はパラメーター化する必要があります

私は次のクラスを持っています(簡単なSpringチュートリアルから)

_public class CarValidator implements Validator {

    public boolean supports(Class aClass) {
        return Car.class.equals(aClass);
    }

    public void validate(Object obj, Errors errors) {
        Car car = (Car) obj;

        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "model", "field.required", "Required field");

        ValidationUtils.rejectIfEmptyOrWhitespace(errors, "price", "field.required", "Required field");

        if( ! errors.hasFieldErrors("price")) {
            if (car.getPrice().intValue() == 0) {
                errors.rejectValue("price", "not_zero", "Can't be free!");
            }
        }

    }
}
_

Validatorクラスは、Spring 2.5の_org.springframework.validation.Validator_クラスです。

サポートメソッドは、次のようなパラメーターを追加しようとすると、警告を表示しています(クラスは生の型です。ジェネリック型のクラスへの参照はパラメーター化する必要があります)

_public boolean supports(Class<?> aClass) ...
_

次のエラーが表示されます。

The method supports(Class<?>) of type CarValidator has the same erasure as supports(Class) of type Validator but does not override it

このタイプの質問については多くのスレッドがありますが、完全な回答を得て、_@SupressWarnings_で問題を「隠す」ことなく実際に理解したいと思います!

62
user167768

インターフェイスは、未加工の型でメソッドを宣言します。その場合、警告なしで適切にオーバーライドすることはできません。

問題の原因は、SpringインターフェースがJava 1.4準拠であると宣言されていることです。Spring3.0は、すべてのクラスをJava 1.5準拠、これで問題が解決します。アップグレードする前に、警告または@SuppressWarning

32
KLE

インターフェイスは、未加工の型の使用を強制する(つまり、正しい型情報を指定することを許可しない)ため、_@SupressWarnings_を使用しない限り、警告なしで実装することはできません。

唯一の本当の修正は、インターフェースを修正することです(つまり、boolean supports(Class<?> aClass)を定義することです)。

9
Joachim Sauer