Авто генерирует реализацию не общего интерфейса

18

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

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

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

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

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

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

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

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

    
задан turbanoff 07.11.2012 в 12:56
источник
  • Я не могу себе представить, что есть что-то такое конкретное (хотя не стесняйтесь доказывать, что я ошибаюсь!), и я подозреваю, что поиск / замена - это, пожалуй, способ пойти –  Brian Agnew 07.11.2012 в 13:04
  • В IntelliJ ничего нет; его подхватывает проверка «необработанного использования параметризованного класса», но у него нет быстрого исправления. –  Spyder 07.11.2012 в 13:06
  • Просто попробовал свои файлы в Eclipse .. Не работал :-) –  Tonny Madsen 18.12.2012 в 14:58
  • @turbanoff Сколько классов мы говорим? Десятки? Сотни? –  Jakub Zaverka 20.12.2012 в 09:47

5 ответов

6

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

implements ObjectBuilder<FIXME>

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

    
ответ дан Guillaume 18.12.2012 в 15:22
  • он сломал бы существующую, правильную реализацию интерфейса –  turbanoff 18.12.2012 в 17:38
  • Просто найдите regexp "реализует \ s + ObjectBuilder \ s * {". Eclipse может это сделать (Ctrl + H, вкладка «Файл», кнопка «Замена» внизу). –  mabn 19.12.2012 в 20:17
3

Вы можете использовать функцию структурного поиска и замены . Тем не менее, он доступен только в Ultimate.     

ответ дан Vic 07.11.2012 в 14:17
2

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 для автоматизации вашего пользовательского преобразования, например:

ответ дан reprogrammer 20.12.2012 в 17:12
1

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

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

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

    
ответ дан Ira Baxter 18.12.2012 в 15:15
1
  

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

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

  

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

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

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

ответ дан Miserable Variable 21.12.2012 в 19:57