18

私はインターフェースを持っています

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

また、プロジェクトには、非汎用バージョンのインターフェースを実装する多くのクラスがあります。

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

これらのクラスすべてを自動変換して、インターフェイスの汎用バージョンを実装することは可能ですか?

これに対する自動リファクタリング:

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

組み込みまたはプラグインのIntellijIDEAはありますか?または他のIDEで?

4

5 に答える 5

6

私がすること: 検索してimplements ObjectBuilder、すべての出現箇所をコンパイルできないものに自動的に置き換えます。

implements ObjectBuilder<FIXME>

次に、コンパイルを試み、すべてのブレークを手動で修正します。それはおそらく、より高度な方法を使用するよりも速いでしょう...

于 2012-12-18T14:22:51.053 に答える
3

構造検索と置換機能を使用できます。ただし、Ultimate エディションでのみ使用できます。

于 2012-11-07T13:17:03.623 に答える
2

NetBeansは、検査と変換と呼ばれる機能を提供しますこれにより、次の形式のカスタム検査変換を記述できます。

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

例えば:

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

このような変換の例については、ブログ投稿をご覧ください。

同様に、IntelliJは、 Structural SearchandReplaceと呼ばれる機能を通じてカスタムコード変換ルールをサポートします。IntelliJのこの機能を使用すると、次のような変換を行うことができます。

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

ただし、上記のルール言語が目的の変換をサポートするのに十分な表現力があるかどうかはわかりません。変換を表現できない場合は、いつでもIDEのリファクタリングAPIを使用して、カスタム変換を自動化できます。例:

于 2012-12-20T16:12:05.780 に答える
1

あなたはおそらくプログラム変換システムに興味があるでしょう。

このようなツールを使用すると、ソースコードパターンの観点からコードへの変更を述べることができます。「これが表示れた場合は、それをその代わりに使用してください」。(これは、別の回答で言及されているプログラム可能な「構造検索と置換」のようなものです)。このカテゴリのより強力なツールは、タイプ(「シンボルテーブル」)に関する情報を提供し、変換を制御するためにそれを利用できるようにします(特定のインターフェイスに関連するエンティティに変更を適用することにのみ関心があるため、必ず必要です)。

そのようなツールはまた、そのような変換の適用を順序付けるためのメタプログラミングを可能にします。これらの2つのアイデアを使用すると、考えている種類などの「大規模な」変更を実行するためのツールを実装できます。

于 2012-12-18T14:15:12.683 に答える
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 で単純な検索/置換を使用しても、これがどのように行われるかがわかります。

于 2012-12-21T18:57:22.013 に答える