Зачем интерфейсу нужны дженерики?

164
12 сентября 2018, 21:50

Узнал что у интерфейса можно определить дженерики, попробовал сделать это в коде, но так и не понял где это используется(и как), т.к. это ни на что не повлияло. P.S. Еще вчера узнал что у методов в интерфейсе может быть тело, если метод статический. Это практически убирает различие между абстрактными классами и интерфейсами(кроме наследования и final переменных).

Answer 1

Дженерики нужны для обобщения. Это относится и к классам, и к интерфейсам.

Пример интерфейса с дженериком:

interface MyExecute<T> {
    void execute(T obj) throws Exception;
}
class ThreadExecute<T> implements MyExecute<T> {
    @Override
    public void execute(T obj) throws Exception {
        System.out.println("obj: " + obj);
        // Тут мы индивидуально, в зависимости от типа объекта делаем обработку
        if (obj instanceof String) {
            // ...
        } else if (obj instanceof List) {
            // ...
        } else {
            // ..
        }
    }
}
class ProcessExecute<T> implements MyExecute<T> {
    @Override
    public void execute(T obj) throws Exception {
        // ...
    }
}
// Можно имплементироваться от интерфейса с указанием конкретного типа:
class ProcessExecuteStr implements MyExecute<String> {
    @Override
    public void execute(String obj) throws Exception {
        // ...
    }
}
public class Main {
    public static void main(String[] args) throws Exception {
        ThreadExecute<String> thread = new ThreadExecute<>();
        thread.execute("abc");
        ThreadExecute<List<String>> thread2 = new ThreadExecute<>();
        thread2.execute(Arrays.asList("1", "a", "@"));    
        MyExecute<Integer> process = new ProcessExecute<>();
        process.execute(+100500);
    }
}
Answer 2

Согласен с написанным выше. Можно было бы везде пользоваться Object типом, а после его приводить к нужному типу(если бы не было джинериков), но тогда появится потенциальная ошибка во время выполнения(ClassCastException), а когда есть джинерки, ошибка будет на этапе компиляции.

Пример: у вас есть List<String>, а вы при вызове метода add() вставляете Integer, то когда есть джинерки, эта ошибка проявится на этапе компиляции, а если нет, то на этапе выполнения.

READ ALSO
Как конвертировать switch case из Java в Kotlin? [закрыт]

Как конвертировать switch case из Java в Kotlin? [закрыт]

В Kotlin это будет выглядеть следующим образом:

208
кириллица в термальном принтере

кириллица в термальном принтере

взял код отсюда http://wwwmets-blog

212
Java чтение и запись none-blocked

Java чтение и запись none-blocked

Мне нужен способ чтение и записи в файл с использованием указателяТо есть что бы я мог поставить указатель на нужную мне позицию в файле и считать...

218