19.10.2016 / 17:42 | |
aRiGaTo Пользователь Сейчас: Offline
Имя: Snork Откуда: Yerevan Регистрация: 03.02.2010
| Jahak, позволяют писать меньше шаблонного кода.
__________________
don't tread on me |
19.10.2016 / 17:43 | |
Витаминыч Супермодератор Сейчас: Offline
Имя: Василиус Откуда: RZN Регистрация: 20.04.2012
| Jahak, я понял то, что когда неизвестен тип входящих данных, то их можно и нужно использовать. К примеру, чтобы не писать несколько перегруженных методов, которые принимают данные разного типа. В дженериках все автоматически определяется и подставляется. Что-то вроде обобщения. И вроде безопаснее использовать их (меньше ошибок при написании кода). Сам глубоко не вникал, тоже жду развернутого ответа __________________
わからない!! |
19.10.2016 / 20:15 | |
Naik Пользователь Сейчас: Offline
Имя: %name% Регистрация: 14.03.2010
| Витаминыч, все верно, только следует помнить что информация о типе затирается при компиляции, так что это по сути синтакс. сахар. Т.е. с таким же успехом можно передавать Object и приводить к нужному типу
|
20.10.2016 / 14:25 | |
vl@volk Пользователь Сейчас: Offline
Имя: Владислав Откуда: Земля Регистрация: 26.12.2012
| Naik, но не всегда удобно городить SomeClass sc = (SomeClass)list.get(index); Лучше уж разок объявить ArrayList<SomeClass> list = new ArrayList<>() и делать нормальный вызов list.get(index)
__________________
знает толк |
20.10.2016 / 22:23 | |
Naik Пользователь Сейчас: Offline
Имя: %name% Регистрация: 14.03.2010
| vl@volk, я ж не против Так и делаю. Просто я о том что для совместимости с 6 джавой в сам байткод ничего нового не напихали. Т.е. никакой магии там нету, просто чуть меньше кода. Правда когда используешь какую-нибудь rxjava, то этих дженериков становится так много, и они так странно себя ведут, что иногда проще закастить обьект |
21.10.2016 / 07:50 | |
aNNiMON Супервизор Сейчас: Offline
Имя: Витёк Регистрация: 11.01.2010
| Naik, проще один раз разобраться и далее писать нормальный код. Есть правило PECS - Produces extends, Consumer - super.
Если есть функция, в которой в List добавляются объекты, то это list - consumer и сигнатура метода будет: void addTo(List<? super T>. Если по этому списку только итерировать, то он - поставщик: void getFrom(List<? extends T>. Если с этим списком в методе происходит и добавление, и получение, то пишем List<T>.
В JVM инструкций не ввели, но зато появились bridge-методы.
__________________
let live |
21.10.2016 / 19:30 | |
Naik Пользователь Сейчас: Offline
Имя: %name% Регистрация: 14.03.2010
| aNNiMON, Ну вот например методы TeamRepository возвращают списки Team, а мне нужно вернуть именно ? extends BaseModel. Эта штука работает, но только если делать дурацкие вызовы `map(t -> t)` @Override
protected Observable<List<? extends BaseModel>> getRequestObservable() {
TeamRepository repo = RestClient.getInstance().getTeamRepository();
Observable<List<? extends BaseModel>> observable = null;
switch (mListType) {
case CREATED_AND_MY:
observable = Observable.zip(repo.getCreatedTeams(mSportType), repo.getMyTeams(mSportType), (teamsCreated, teamsMy) -> {
List<BaseModel> models = new ArrayList<>();
Iterator<Team> i = teamsCreated.iterator();
while (i.hasNext()) {
if (mExcludedTeams.contains(i.next())) i.remove();
}
if (!teamsCreated.isEmpty()) {
models.add(new SimpleItem<>(ITEM_TAG_HEADER, getString(R.string.header_teams_created), -5L));
models.addAll(teamsCreated);
}
i = teamsMy.iterator();
while (i.hasNext()) {
if (mExcludedTeams.contains(i.next())) i.remove();
}
if (!teamsMy.isEmpty()) {
models.add(new SimpleItem<>(ITEM_TAG_HEADER, getString(R.string.teams_player_in), -6L));
models.addAll(teamsMy);
}
return models;
});
break;
case FAVORITE:
observable = repo.getFavoriteTeams(mSportType).map(t -> t);
break;
case NEARBY:
ResultType filter = mNearbyLocation.getFilter() == -1 ? null : ResultType.sportTypes()[mNearbyLocation.getFilter()];
observable = repo.getNearbyTeams(mNearbyLocation.getLat(), mNearbyLocation.getLng(), mNearbyLocation.getRadius(), filter).map(l -> l);
break;
case FROM_EVENT:
observable = repo.getTeamsForEvent(ModelUtils.toIdsList(mCandidates), mSportType).map(l -> l);
break;
}
if (observable != null) {
return observable.flatMap(Observable::from)
.filter(team -> !mExcludedTeams.contains(team)).toList().map(l -> l);
} else return null;
}
|
21.10.2016 / 20:54 | |
aNNiMON Супервизор Сейчас: Offline
Имя: Витёк Регистрация: 11.01.2010
| Naik, что за Observable<List<? extends BaseModel>>? Определись, что ты делаешь с этим списком: добавляешь в него или читаешь из него? Почему не использовать List<BaseModel>? А если появляется такая бессмысленная операция как map(t -> t), то это повод задуматься: ты делаешь что-то не так (либо разработчики RxJava, что вряд ли).
__________________
let live Изменено aNNiMON (21.10 / 21:25) (всего 2 раза) |
21.10.2016 / 23:22 | |
Naik Пользователь Сейчас: Offline
Имя: %name% Регистрация: 14.03.2010
| aNNiMON, Я его получаю, модифицирую если нужно, и возвращаю. Это не мои как бы проблемы, а тупых дженериков, для которых ? extends BaseModel это не одно и тоже что и Team extends BaseModel. Вся суть map(t -> t) - это преобразование Team в ? extends BaseModel, которой она и так является. Можно тупо закастить и все будет работать
Изменено Naik (21.10 / 23:25) (всего 4 раза) |
22.10.2016 / 14:00 | |
DominaN Пользователь Сейчас: Offline
Имя: Кирилл Откуда: Смоленск Регистрация: 28.09.2011
| Naik, это откудова код?
|