Вниз  Java-программирование (1-ые посты)
- 19.10.2016 / 17:42
aRiGaTo
  Пользователь

aRiGaTo 
Сейчас: Offline
Jahak, позволяют писать меньше шаблонного кода.
__________________
 don't tread on me
- 19.10.2016 / 17:43
Витаминыч
  Супермодератор

Витаминыч 
Сейчас: Offline
Jahak, я понял то, что когда неизвестен тип входящих данных, то их можно и нужно использовать. К примеру, чтобы не писать несколько перегруженных методов, которые принимают данные разного типа. В дженериках все автоматически определяется и подставляется. Что-то вроде обобщения. И вроде безопаснее использовать их (меньше ошибок при написании кода). Сам глубоко не вникал, тоже жду развернутого ответа :gg:
__________________
 わからない!!
- 19.10.2016 / 20:15
Naik
  Пользователь

Naik 
Сейчас: Offline
Витаминыч, все верно, только следует помнить что информация о типе затирается при компиляции, так что это по сути синтакс. сахар. Т.е. с таким же успехом можно передавать Object и приводить к нужному типу
- 20.10.2016 / 14:25
vl@volk
  Пользователь

vl@volk 
Сейчас: Offline
Naik, но не всегда удобно городить SomeClass sc = (SomeClass)list.get(index); Лучше уж разок объявить ArrayList<SomeClass> list = new ArrayList<>() и делать нормальный вызов list.get(index)
__________________
 знает толк
- 20.10.2016 / 22:23
Naik
  Пользователь

Naik 
Сейчас: Offline
vl@volk, я ж не против :gg: Так и делаю. Просто я о том что для совместимости с 6 джавой в сам байткод ничего нового не напихали. Т.е. никакой магии там нету, просто чуть меньше кода. Правда когда используешь какую-нибудь rxjava, то этих дженериков становится так много, и они так странно себя ведут, что иногда проще закастить обьект
- 21.10.2016 / 07:50
aNNiMON
  Супервизор

aNNiMON 
Сейчас: Offline
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
  Пользователь

Naik 
Сейчас: Offline
aNNiMON, Ну вот например методы TeamRepository возвращают списки Team, а мне нужно вернуть именно ? extends BaseModel. Эта штука работает, но только если делать дурацкие вызовы `map(t -> t)` :gg:
  1. @Override
  2. protected Observable<List<? extends BaseModel>> getRequestObservable() {
  3.     TeamRepository repo = RestClient.getInstance().getTeamRepository();
  4.     Observable<List<? extends BaseModel>> observable = null;
  5.     switch (mListType) {
  6.  
  7.         case CREATED_AND_MY:
  8.             observable = Observable.zip(repo.getCreatedTeams(mSportType), repo.getMyTeams(mSportType), (teamsCreated, teamsMy) -> {
  9.                 List<BaseModel> models = new ArrayList<>();
  10.                 Iterator<Team> i = teamsCreated.iterator();
  11.                 while (i.hasNext()) {
  12.                     if (mExcludedTeams.contains(i.next())) i.remove();
  13.                 }
  14.                 if (!teamsCreated.isEmpty()) {
  15.                     models.add(new SimpleItem<>(ITEM_TAG_HEADER, getString(R.string.header_teams_created), -5L));
  16.                     models.addAll(teamsCreated);
  17.                 }
  18.                 i = teamsMy.iterator();
  19.                 while (i.hasNext()) {
  20.                     if (mExcludedTeams.contains(i.next())) i.remove();
  21.                 }
  22.                 if (!teamsMy.isEmpty()) {
  23.                     models.add(new SimpleItem<>(ITEM_TAG_HEADER, getString(R.string.teams_player_in), -6L));
  24.                     models.addAll(teamsMy);
  25.                 }
  26.                 return models;
  27.             });
  28.             break;
  29.  
  30.         case FAVORITE:
  31.             observable = repo.getFavoriteTeams(mSportType).map(t -> t);
  32.             break;
  33.  
  34.         case NEARBY:
  35.             ResultType filter = mNearbyLocation.getFilter() == -1 ? null : ResultType.sportTypes()[mNearbyLocation.getFilter()];
  36.             observable = repo.getNearbyTeams(mNearbyLocation.getLat(), mNearbyLocation.getLng(), mNearbyLocation.getRadius(), filter).map(l -> l);
  37.             break;
  38.  
  39.         case FROM_EVENT:
  40.             observable = repo.getTeamsForEvent(ModelUtils.toIdsList(mCandidates), mSportType).map(l -> l);
  41.             break;
  42.     }
  43.     if (observable != null) {
  44.         return observable.flatMap(Observable::from)
  45.                 .filter(team -> !mExcludedTeams.contains(team)).toList().map(l -> l);
  46.     } else return null;
  47. }

- 21.10.2016 / 20:54
aNNiMON
  Супервизор

aNNiMON 
Сейчас: Offline
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
  Пользователь

Naik 
Сейчас: Offline
aNNiMON, Я его получаю, модифицирую если нужно, и возвращаю. Это не мои как бы проблемы, а тупых дженериков, для которых ? extends BaseModel это не одно и тоже что и Team extends BaseModel. Вся суть map(t -> t) - это преобразование Team в ? extends BaseModel, которой она и так является. Можно тупо закастить и все будет работать

Изменено Naik (21.10 / 23:25) (всего 4 раза)
- 22.10.2016 / 14:00
DominaN
  Пользователь

DominaN 
Сейчас: Offline
Naik, это откудова код?
Наверх  Всего сообщений: 16875
Фильтровать сообщения
Поиск по теме
Файлы топика (794)