Вы можете отключить предупреждение компилятора.См. Что такое SuppressWarnings ("unchecked") в Java?
Компилятор предупреждает вас по причине.value
может содержать объект некоторого подтипа T
, и между Class<Parent>
и Class<Child>
существуют важные различия.В вашем случае вы можете видеть, что вы не делаете ничего небезопасного, но компилятор просто следует правилам.
Представьте, если метод немного отличается, и есть способ получить другое значение типа T
:
<T> void foo(T a, T b) {
final Class<T> aClass = (Class<T>) a.getClass();
// What can go wrong? casting T to T
T c = aClass.cast(b);
}
// but what if the two parameters are of different classes at runtime
foo(5, 5.5); // ClassCastException!
Или что если мы допустим Class<T>
для возврата в качестве возвращаемого значения:
<T> Class<T> foo(T val) {
final Class<T> aClass = (Class<T>) val.getClass();
return aClass;
}
// uhoh is declared as Class<Number> but contains Class<Integer> at runtime
Class<Number> uhoh = foo(5);
// Ok to cast Double to Number but not to Integer
Number num = uhoh.cast(5.5); // ClassCastException!