На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
! Следующие правила действуют в данном разделе в дополнение к общим Правилам Форума
1. Здесь обсуждается Java, а не JavaScript! Огромная просьба, по вопросам, связанным с JavaScript, SSI и им подобным обращаться в раздел WWW Masters или, на крайний случай, в Многошум.
2. В случае, если у вас возникают сомнения, в каком разделе следует задать свой вопрос, помещайте его в корневую ветку форума Java. В случае необходимости, он будет перемещен модераторами (с сохранением ссылки в корневом разделе).

3. Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.
4. Не рекомендуется создавать несколько несвязанных вопросов в одной теме. Пожалуйста, создавайте по одной теме на вопрос.
Модераторы: dark_barker, wind
  
> ограничение супертипа, generics wildcards
    кто понял что означает ограничение ? super Person?
    и в чем его отличие от ? extends Person?
    Person это некий класс.
    Rabbit don't come easy: https://github.com/Cfon/ :D
      Шаблон "? extends A" - любой тип, наследующий A, включая сам A; можно передать A, можно передать "B extends A". Шаблон "? super A" - любой тип из иерархии наследования вплоть до A; можно передать Object, можно передать A, нельзя передать "B extends A". Ни для чего путного вариант с super за 14 лет не пригодился, потому как считается компилятором за тип Object, который наследуют все.
        Разобрался с ограничениями типа, вот набросал примерчик с персонажем JavaDrocher :D
        ExpandedWrap disabled
          package com.mudosoft.libraries;
           
          import java.util.ArrayList;
          import java.util.List;
          import java.util.function.Predicate;
           
          public class WildcardDemo {
              public static void main(String[] args) {
                  List<Person> persons = new ArrayList<>();
                  persons.add(new JavaDrocher("Gregory",42, 10));
                  persons.add(new JavaDrocher("Julia", 30, 7));
                  persons.add(new JavaDrocher("Mark", 25, 5));
           
                  printPersons(persons);
           
                  List<Person> seniors = getPersons(persons, person -> person.getAge() >= 30);
                  printPersons(seniors);
              }
           
              static void printPersons(List<? extends Person> persons) {
                  for (Person person: persons) {
                      System.out.println(person.getName());
                  }
              }
           
              static List<Person> getPersons(List<? extends Person> persons, Predicate<? super Person> pred) {
                  List<Person> result = new ArrayList<>();
                  for (Person person: persons) {
                      if (pred.test(person)) {
                          result.add(person);
                      }
                  }
                  return result;
              }
          }
           
          class Person {
              private String name;
              private int age;
           
              public Person(String name, int age) {
                  this.name = name;
                  this.age = age;
              }
           
              public int getAge() {
                  return age;
              }
           
              public String getName() {
                  return name;
              }
          }
           
          class JavaDrocher extends Person {
              private int grade;
           
              public int getGrade() {
                  return grade;
              }
           
              public JavaDrocher(String name, int age, int grade) {
                  super(name, age);
                  this.grade = grade;
              }
          }


        Функциональный вариант getPersons на потоках (Stream API) :D
        ExpandedWrap disabled
          static List<Person> getPersons(List<? extends Person> persons, Predicate<? super Person> pred) {
              return persons.stream().filter(pred).collect(Collectors.toList());
          }

        Да да не удивляйтесь! Функциональный стиль уже и в Java! :D
        Сообщение отредактировано: Cfon -
        Rabbit don't come easy: https://github.com/Cfon/ :D
          Цитата Cfon @
          Да да не удивляйтесь! Функциональный стиль уже и в Java!

          Java 8 вышла почти пять лет назад. А ты быстрый.
          “Object-oriented design is the roman numerals of computing.” — Rob Pike
          All software sucks
          1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script Execution time: 0,0795 ]   [ 14 queries used ]   [ Generated: 21.02.19, 18:08 GMT ]