Метод по умолчанию для расширения существующих интерфейсов JDK

#java #java-8

#java #java-8

Вопрос:

Могу ли я использовать методы по умолчанию для расширения существующих интерфейсов JDK, например List , добавить дополнительный метод ко всему, что его реализует?

Если да, есть ли где-нибудь простой пример?

Комментарии:

1. Нет, это невозможно сделать; это кажется очень тревожной идеей.

2. После компиляции типа его невозможно изменить. Таким образом, вы не можете добавлять функциональность так, как вы описываете.

3. Нет. Java не поддерживает методы расширения .

Ответ №1:

Код JDK, как и любой другой фрагмент скомпилированного кода, не может быть изменен. Таким образом, любой существующий тип ( List или другой) не может изменить свое поведение с помощью добавления метода или любого другого механизма.

Единственный вариант — просто расширить классы, которые вы хотите изменить (если они не объявлены как final — например, String не могут быть расширены) и изменить их функциональность. Очевидно, что любой расширенный класс также имеет тип всех своих родителей, поэтому, например, ExtendedList класс также является a List , предполагая, что его объявление выглядит примерно так

 public class ExtendedList<E> extends List<E>
{
    ...
}
 

Вероятно, вы спрашиваете о функциональности методов расширения, как уже упоминалось в комментарии выше, что является довольно интересной функцией, не поддерживаемой Java . Другие языки, такие как C# , предлагают такую поддержку.

Комментарии:

1. Добро пожаловать. Решение, представленное dkatzel, также интересно и ближе к тому, что вы изначально просили, хотя тот, который вы выбрали, проще и «только для Java». 🙂

Ответ №2:

Вы можете создавать свои собственные методы расширения для добавления методов в классы JDK, но не на Java, а с помощью других языков JVM, таких как Groovy.

вот отличное руководство по добавлению методов расширения

http://groovy.codehaus.org/Creating an расширение модуль

По сути, вам просто нужно создать новый класс со статическим методом, который вы хотите добавить. Первым параметром этого метода является объект, к которому вы хотите добавить метод, а любые другие параметры являются параметрами вашего метода

 public class MyExtension{
     public static String myMethod(List list, /*  other params here*/){
              //do stuff

     }
}
 

Затем вам нужно добавить имя файла дескриптора модуля org.codehaus.groovy.runtime.ExtensionModule в META-INF/services каталог со следующим содержимым:

 moduleName=your-module-name
moduleVersion=your-module-version
extensionClasses=your-extension-full-classname
staticExtensionClasses= other-extension-class-for-static-methods
 

И это все

Ответ №3:

Нет, нет способа добавить новый метод по умолчанию к интерфейсам, которые вы сами не контролируете.