Вопрос по параметризированным generics в Java

ifani

Есть класс:

public class Location implements Parcelable

Есть метод (в каком-то стороннем классе)

public <T extends Parcelable> T getParcelable(String key)

Есть переменная

Location curLocation

А теперь такой вызов

curLocation = getIntent.getExtras.getParcelable("curLocation");

Вопросы:
1) Почему от меня не требуется явно указать тип возвращаемого значения

curLocation = getIntent.getExtras.<Location>getParcelable("curLocation")

Ведь метод может вернуть любую реализацию интерфейса Parcelable, и будет класскаст исключение в рантайме, а ведь одной из причин добавления дженириков как раз и было желание избавиться от таких исключений.
2) Зачем вообще нужно такое объявление метода getParcelable? Есть какие-то ситуации, где его можно будет подставить, а вот такой нельзя?

public Parcelable getParcelable(String key)

danilov

> 1) Почему от меня не требуется явно указать тип возвращаемого значения
Потому что тип возвращаемого значения уже будет Location.
От classCastException тебе не избавиться в любом случае, смысл генериков - избавиться от граничных кастов туда-обратно.
Ну и плюс механизм отслеживания корректности кастов (типа строгой типизации)
> 2) Зачем вообще нужно такое объявление метода getParcelable? Есть какие-то ситуации, где его можно будет подставить, а вот такой нельзя
Как раз для этого и нужно. Чтоб не писать касты руками.

katrin2201

> Почему от меня не требуется явно указать тип возвращаемого значения
потому что type inference
http://java.sun.com/docs/books/jls/third_edition/html/expres...
> Ведь метод может вернуть любую реализацию интерфейса Parcelable, и будет класскаст исключение в рантайме, а ведь одной из причин добавления дженириков как раз и было желание избавиться от таких исключений.
Так как у тебя метод возвращает T, то реализация метода должна быть такая, что возвращает T. Иначе компилятор будет ругаться unchecked-cast ворнингами на реализацию метода.
> Зачем вообще нужно такое объявление метода getParcelable?
Скорее всего, автору было лень каждый раз кастить результат метода к конкретному типу имея unchecked cast, и он типа обошелся вот так, засунув один unchecked cast в тело метода. Что есть, конечно, не тру.
>Есть какие-то ситуации, где его можно будет подставить, а вот такой нельзя?
Фактически пример к моим словам выше
Location l = getParcelable;
Оставить комментарий
Имя или ник:
Комментарий: