Java: возвращаемый тип конкретного метода абстрактного класса становится необработанным

Следующий код выдает два предупреждения при компиляции с -Xlint. Один из них утверждает, что тип C<Double> требуется, но C был найден, хотя тип возврата очень четко C<Double>,

Я нашел решение, которое избавляет от обоих предупреждений, но я не понимаю (и не хочу знать), почему это было предупреждение в первую очередь и почему оно исчезло.

Код:

public class Test {
    public static void main(String[] args) {
        B b = new B();
        thing(b);
    }

    static void thing(A a) {
        C<Double> c = a.a();
    }
}

abstract class A<T> {
    C<Double> a() {
        return new C<Double>();
    }
}

class B extends A<String> {}

class C<T> {}

Предупреждения:

Test.java:7: warning: [rawtypes] found raw type: A
    static void thing(A a) {
                      ^
  missing type arguments for generic class A<T>
  where T is a type-variable:
    T extends Object declared in class A
Test.java:8: warning: [unchecked] unchecked conversion
        C<Double> c = a.a();
                         ^
  required: C<Double>
  found:    C
2 warnings

Решение для предупреждений:

Я изменился static void thing(A a) в static void thing(A<?> a),

Но:

Там нет причин для a.a() возвращать C скорее, чем C<Double> который является типом возврата, указанным везде. Я не понимаю почему A будучи сырым, должен сделать тип возврата всех своих методов сырым, когда параметры типа A не влияет .a();

0 ответов

Другие вопросы по тегам