getClass () универсального параметра метода безопасности приведения - PullRequest
0 голосов
/ 15 ноября 2018

Безопасен ли этот бросок?

private <T> void foo(T value) {
    final Class<T> aClass = (Class<T>) value.getClass();
} 

Существует ли более элегантный способ сделать это?

Можно ли избежать неконтролируемого предупреждения о сотворении?

1 Ответ

0 голосов
/ 23 ноября 2018

Вы можете отключить предупреждение компилятора.См. Что такое 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!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...