Подтвердить что ты не робот

Автоматическое генерирование реализации не общего интерфейса

У меня есть интерфейс

public interface ObjectBuilder<E> {  
   E buildObject();
}

Кроме того, в проекте есть много классов, которые реализуют не общую версию интерфейса.

class MyClassBuilder implements ObjectBuilder {
    public MyClass buildObject() {/**/}
}

Возможно ли автоматическое преобразование всех этих классов, чтобы они реализовали общую версию интерфейса?

автоматический рефакторинг:

class MyClassBuilder implements ObjectBuilder<MyClass> {
    public MyClass buildObject() {/**/}
}

Есть ли встроенный или подключаемый модуль Intellij IDEA? Или в другой среде IDE?

4b9b3361

Ответ 1

Что бы я сделал: искать implements ObjectBuilder и автоматически заменять все вхождения тем, что не компилируется, например

implements ObjectBuilder<FIXME>

Затем попытайтесь скомпилировать и вручную исправить все перерывы. Вероятно, это будет быстрее, чем использовать более продвинутый метод...

Ответ 3

NetBeans предлагает функцию Inspect and Transform, которая позволяет писать пользовательские проверки и преобразования:

<source-pattern> :: <conditions>
=> <target-pattern> :: <conditions>
;;

Например:

$f.toURL() :: $f instanceof java.io.File
=> $f.toURI().toURL()
;;

Вы можете найти больше примеров таких преобразований в сообщении в блоге.

Аналогично, IntelliJ поддерживает собственные правила преобразования кода с помощью функции Структурный поиск и замена. Используя эту функцию IntelliJ, вы можете сделать преобразования следующим образом:

class $TestCase$ extends TestCase {
  $MyClassContent$
}
=>
class $TestCase$ extends OurHomeGrownTestCase {
  $MyClassContent$
}

Однако я не уверен, что вышеприведенные языки правил достаточно выразительны, чтобы поддерживать желаемое преобразование. Если они не могут выразить ваше преобразование, вы всегда можете прибегнуть к API рефакторинга IDE для автоматизации вашего пользовательского преобразования, например:

Ответ 4

Вам, вероятно, будет интересно Системы преобразования программ.

Такие инструменты позволяют указывать изменения кода в терминах шаблонов исходного кода: "если вы видите это, а затем замените его на это". (Это похоже на программируемый "структурный поиск и замену", упомянутый в другом ответе). Более сильные инструменты в этой категории предоставляют информацию о типах ( "таблицах символов" ) и делают доступными для управления преобразованиями (вы, безусловно, нуждаетесь в этом, потому что вас интересует только применение изменений к объектам, связанным с определенным интерфейсом.)

Такие инструменты также позволяют метапрограммировать последовательность действий таких преобразований. С этими двумя идеями можно реализовать инструменты для проведения "массовых" изменений, таких как вид, который вы созерцаете.

Ответ 5

Возможно ли автоматическое преобразование всех этих классов, чтобы они реализовали общую версию интерфейса?

Да, возможно, для соответствующего определения "авто":)

Есть ли встроенный или подключаемый модуль Intellij IDEA? Или в другой среде IDE?

Преобразование, которое вы ищете, довольно сложно:

for each class (interface) that implements ObjectBuilder (not ObjectBuilder<.*>) 
  if the class declares/defines the method buildObject with return type X 
  then 
    modify the class to implement ObjectBuilder<X> instead of ObjectBuilder. 

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

С другой стороны, жестко закодированный script вообще не кажется сложным. У меня нет опыта работы с IntelliJ IDEA, но я вижу, как это можно сделать, даже используя простой поиск/замену в Emnacs Lisp.