
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.97.9.169] |
![]() |
|
Сообщ.
#1
,
|
|
|
кто понял что означает ограничение ? super Person?
и в чем его отличие от ? extends Person? Person это некий класс. |
![]() |
Сообщ.
#2
,
|
|
Шаблон "? extends A" - любой тип, наследующий A, включая сам A; можно передать A, можно передать "B extends A". Шаблон "? super A" - любой тип из иерархии наследования вплоть до A; можно передать Object, можно передать A, нельзя передать "B extends A". Ни для чего путного вариант с super за 14 лет не пригодился, потому как считается компилятором за тип Object, который наследуют все.
|
Сообщ.
#3
,
|
|
|
Разобрался с ограничениями типа, вот набросал примерчик с персонажем JavaDrocher
![]() ![]() ![]() 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) ![]() ![]() ![]() static List<Person> getPersons(List<? extends Person> persons, Predicate<? super Person> pred) { return persons.stream().filter(pred).collect(Collectors.toList()); } Да да не удивляйтесь! Функциональный стиль уже и в Java! ![]() |
![]() |
Сообщ.
#4
,
|
|
Цитата Cfon @ Да да не удивляйтесь! Функциональный стиль уже и в Java! Java 8 вышла почти пять лет назад. А ты быстрый. |