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