Форум программистов, компьютерный форум, киберфорум
Java для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.71/21: Рейтинг темы: голосов - 21, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 29.06.2020
Сообщений: 19

Для чего нужны интерфейсы?

24.07.2022, 01:13. Показов 4562. Ответов 91
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!
Я посмотрел вокруг и тоже решил позадавать тупые вопросы. Например, я не могу понять, зачем нужны интерфейсы как таковые? Что мешает реализовывать методы без использования интерфейсов? Почему-то большинство людей отвечают на этот вопрос в стиле "ну интерфейс - это такая штука, ей можно делать то-другое", а после вопроса "кто мешает делать то же самое без интерфейса? Вот убираешь "implements"... ии?" замолкают.
Из всего, что я выяснил, у меня получилось два пункта: первое - по интерфейсу можно группировать разные объекты (например, запихнуть в ArrayList), второе - чтобы в большом проекте не провтыкать вещи, которые должен реализовывать определённый класс. Имеют ли мои выводы отношение к жизни и можно ли к ним добавить ещё что-то?
Ну или ткните в умную литературу, только о том, что такое интерфейс и как его делать я и так начитался.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.07.2022, 01:13
Ответы с готовыми решениями:

Для чего нужны параметры метода? Return для хранения данных?
Привет всем! Подскажите пожалуйста, параметры метода нужны для того что бы получать значения с вызывающего класса? И не важно как именуется...

Для чего нужны эти скобки?
Доброго времени суток! Я начинающий в Java и вот совсем недавно занялся Swing. На Швабре прочитал статью о том как создать свой LaF(Look...

Для чего нужен абстрактные классы/интерфейсы?
Для чего нужны абстрактные классы/интерфейсы? Уже устал лазить по форумам, везде довольно размытые ответы. Я понимаю, что абстрактный класс...

91
 Аватар для Tavashi
1172 / 762 / 194
Регистрация: 21.05.2016
Сообщений: 1,858
28.07.2022, 15:37
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Arsegg Посмотреть сообщение
Завязывай с алкоголем:
Мне не нужно ничего завязывать:
Цитата Сообщение от Tavashi Посмотреть сообщение
Откуда такое условие взялось?
0
28.07.2022, 15:39

Не по теме:

Откуда такое условие взялось?
От верблюда. Такой ответ устроит?
Мне не нужно ничего завязывать:
Лечись, пока не поздно - синька до добра не доведет.

0
 Аватар для Tavashi
1172 / 762 / 194
Регистрация: 21.05.2016
Сообщений: 1,858
28.07.2022, 15:43
Цитата Сообщение от Arsegg Посмотреть сообщение
От верблюда. Такой ответ устроит?
Ну и к чем нам здесь пустая лирика?

Добавлено через 3 минуты
Цитата Сообщение от Arsegg Посмотреть сообщение
Лечись, пока не поздно - синька до добра не доведет.
Такие домыслы никак не поспособствуют вашей карьере.
0
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
28.07.2022, 15:52
Ну и к чем нам здесь пустая лирика?
Так увижу ли я твое решение на дженериках без рефлексии или продолжишь упираться и нести околесицу?

Добавлено через 32 секунды
За сим откланиваюсь.
0
 Аватар для Tavashi
1172 / 762 / 194
Регистрация: 21.05.2016
Сообщений: 1,858
28.07.2022, 15:54
Цитата Сообщение от Arsegg Посмотреть сообщение
Так увижу ли я твое решение на дженериках без рефлексии или продолжишь упираться и нести околесицу?
Такого условия не было, а хамством вы вряд ли чего-то добьетесь.
0
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
28.07.2022, 15:54
Такого условия не было
Как скажешь.
0
 Аватар для Tavashi
1172 / 762 / 194
Регистрация: 21.05.2016
Сообщений: 1,858
28.07.2022, 15:56
Цитата Сообщение от Arsegg Посмотреть сообщение
Как скажешь.
Так я и сказал об этом сразу и гораздо раньше.
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2773 / 491
Регистрация: 28.04.2012
Сообщений: 8,760
28.07.2022, 21:18
Цитата Сообщение от Catstail Посмотреть сообщение
еще одна причина: предположит, у тебя 5 классов. Ты вручную добавляешь им нужную функциональность. Сможешь написать универсальный метод, который в качестве одного из параметров будет принимать объект любого из этих пяти классов? Думаю, что вряд ли.
Легко!

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import java.util.function.ToDoubleFunction;
 
public class NoInterfaces {
 
    static <A> void printArea(ToDoubleFunction<A> area, A figure) {
        System.out.println(area.applyAsDouble(figure));
    }
 
    public static void main(String[] args) {
        printArea(Square::area, new Square(2));
        printArea(Rectangle::area, new Rectangle(2, 3));
        printArea(Circle::area, new Circle(1));
    }
}
 
record Square(double side) {
 
    double area() {
        return side * side;
    }
}
 
record Rectangle(double width, double height) {
 
    double area() {
        return width * height;
    }
}
 
record Circle(double radius) {
 
    double area() {
        return Math.PI * radius * radius;
    }
}
1
 Аватар для Tavashi
1172 / 762 / 194
Регистрация: 21.05.2016
Сообщений: 1,858
28.07.2022, 22:20
Сейчас прибежит Arsegg с криками, что это пример не по его условиям.
0
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
28.07.2022, 22:45
Tavashi, болезный, угомонись.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38161 / 21096 / 4306
Регистрация: 12.02.2012
Сообщений: 34,683
Записей в блоге: 14
29.07.2022, 05:18
korvin_, Но придется явно указывать класс (Rectangle :: и т.п.) Или я чего-то не понял? С интерфейсами удобнее...
1
 Аватар для Tavashi
1172 / 762 / 194
Регистрация: 21.05.2016
Сообщений: 1,858
01.08.2022, 14:43
Цитата Сообщение от Catstail Посмотреть сообщение
С интерфейсами удобнее...
Все три представленных способа не предлагаются в качестве замены интерфейсов. Это академический интерес.
Возможно, есть еще способы.
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2773 / 491
Регистрация: 28.04.2012
Сообщений: 8,760
01.08.2022, 16:17
Цитата Сообщение от Catstail Посмотреть сообщение
Но придется явно указывать класс (Rectangle :: и т.п.)
Можешь не указывать:

Java
1
2
3
4
5
    public static void main(String[] args) {
        printArea(x -> x.area(), new Square(2));
        printArea(x -> x.area(), new Rectangle(2, 3));
        printArea(x -> x.area(), new Circle(1));
    }
1
01.08.2022, 16:34

Не по теме:

korvin_, все-таки это очень далеко до утиной типизации...

0
01.08.2022, 16:37

Не по теме:

Цитата Сообщение от Arsegg Посмотреть сообщение
все-таки это очень далеко до утиной типизации
А это и не утиная типизация.

0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38161 / 21096 / 4306
Регистрация: 12.02.2012
Сообщений: 34,683
Записей в блоге: 14
02.08.2022, 08:13
korvin_, хороший пример... Но меня смущает слово "double". Как обстоит дело с универсальностью? И, если возвратиться к теме, то можно признать, что использование интерфейсов - это удобное (хотя и не единственное) обеспечение полиморфизма.
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2773 / 491
Регистрация: 28.04.2012
Сообщений: 8,760
02.08.2022, 09:19
Цитата Сообщение от Catstail Посмотреть сообщение
Но меня смущает слово "double"
Оно там много где встречается, где оно тебя смущает?
0
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
02.08.2022, 09:58
Цитата Сообщение от korvin_ Посмотреть сообщение
x -> x.area()
Цитата Сообщение от korvin_ Посмотреть сообщение
::area
Много дублирования кода только для того, чтобы вызвать метод area. Что если новый класс будет возвращать, например, не double, а int? Метод перестанет работать.
Любое сужение выходного типа, которое доступно из коробки для интерфейсов, недоступно для данного решения.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38161 / 21096 / 4306
Регистрация: 12.02.2012
Сообщений: 34,683
Записей в блоге: 14
02.08.2022, 10:39
korvin_, как я понял, ToDoubleFunction (а также ToIntegerFunction ...) - это возможности для решения поставленной задачи для функций, возвращающих значение заданного типа. Мне кажется, это - сужение универсальности. Но самое интересное не это (в конце концов я не утверждал категорически, что написать универсальную функцию без интерфесов нельзя).

Вот ссылка.


Там написано следующее (перевод машинный, варварский):

***

Интерфейс ToDoubleFunction <T>

Типовые параметры:

T - тип входа в функцию

Функциональный интерфейс:
Это функциональный интерфейс, поэтому он может быть использован в качестве мишени назначения для лямбда-выражения или ссылки на метод.

@FunctionalInterface public interface ToDoubleFunction<T>

Представляет функцию, которая возвращает результат с двойным значением. Это double примитивная специализация для Function . Это функциональный интерфейс , функциональным методом которого является applyAsDouble(Object) .

***

И получается, что интерфейсы все-таки нужны...
1
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2773 / 491
Регистрация: 28.04.2012
Сообщений: 8,760
02.08.2022, 13:45
Цитата Сообщение от Arsegg Посмотреть сообщение
Много дублирования кода только для того, чтобы вызвать метод area.
А кому сейчас легко? ))

Цитата Сообщение от Arsegg Посмотреть сообщение
Что если новый класс будет возвращать, например, не double, а int? Метод перестанет работать.
Любое сужение выходного типа, которое доступно из коробки для интерфейсов, недоступно для данного решения.
С чего ты взял? Всё прекрасно работает. =)

Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import java.util.function.ToDoubleFunction;
 
public class NoInterfaces {
 
    static <A> void printArea(ToDoubleFunction<A> area, A figure) {
        System.out.println(area.applyAsDouble(figure));
    }
 
    public static void main(String[] args) {
        printArea(Square::area, new Square(2));
        printArea(Rectangle::area, new Rectangle(2, 3));
        printArea(Circle::area, new Circle(1));
 
        printArea(x -> x.area(), new Square(2));
        printArea(x -> x.area(), new Rectangle(2, 3));
        printArea(x -> x.area(), new Circle(1));
    }
}
 
/*
* We have an int here
* */
record Square(int side) {
 
    int area() {
        return side * side;
    }
}
 
record Rectangle(double width, double height) {
 
    double area() {
        return width * height;
    }
}
 
record Circle(double radius) {
 
    double area() {
        return Math.PI * radius * radius;
    }
}


Добавлено через 1 минуту
Цитата Сообщение от Catstail Посмотреть сообщение
И получается, что интерфейсы все-таки нужны...
Ну так это лишь потому, что в Java нет функциональных типов. Только примитивы и интерфейсы/объекты. Но ты можешь условно считать это просто указателем на функцию. )

Добавлено через 25 минут
Цитата Сообщение от korvin_ Посмотреть сообщение
Но ты можешь условно считать это просто указателем на функцию. )
Например =)
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <iostream>
 
template <typename T, typename R>
void print_area(R (*area)(T&), T& figure)
{
    std::cout << area(figure) << std::endl;
}
 
namespace square
{
    struct T
    {
        int side;
        T(int side) : side(side) {}
    };
 
    int area(T& square) { return square.side * square.side; }
}
 
namespace rectangle
{
    struct T
    {
        double width;
        double height;
 
        T(double width, double height) : width(width), height(height) {}
    };
    
    double area(T& rect) { return rect.width * rect.height; }
}
 
int main()
{
    square::T s(2);
    rectangle::T r(2, 3);
 
    print_area(&square::area, s);
    print_area(&rectangle::area, r);
    
    return 0;
}

--- https://rextester.com/ODSF34941
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.08.2022, 13:45
Помогаю со студенческими работами здесь

Для чего нужны custom Tags ?
Для чего вы используете custom Tags? Приведите конкретные примеры.

Struts для чего они нужны?
Привет всем! Сразу прошу не бить ногами, если кому-то вопрос показался идиотским. Но дело в том, что уже некоторое время пытаюсь...

Зачем нужны интерфейсы?
Начинаю изучать JAVA , есть такое понятие как интерфейс, вот, умею пользоваться, но не понимаю зачем они нужны. Зачем нужны интерфейсы?

Что такое Ant и Struts, и для чего нужны?
Доброго времени суток! Во многих IDE очень много упоминается про Ant и Struts. Хотелось бы узнать по подробнее от профессионалов, что...

Коллекции List/ArrayList: чем отличаются и для чего нужны?
ОБЪЯСНИТЕ ЧТО ТАКОЕ LIST И ARRAYLIST,ЧЕМ ОНИ ОТЛИЧАЮТСЯ И ДЛЯ ЧЕГО НУЖНЫ ВОТ ЕЩЕ ДВА ЗАДАНИЯ,Я ЧТО-ТО ПОПЫТАЛСЯ СДЕЛАТЬ,НО ПОКА ЧТО НЕ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru