#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:
Нет, нет способа добавить новый метод по умолчанию к интерфейсам, которые вы сами не контролируете.