1

この問題を調査しているときに、この投稿のタイトルに似たエラーが発生した投稿を多数見つけました。この問題は、開発中のプラグイン クラスの関数にStringを渡そうとしたときにのみエラーが表示されるという点で異なります。

RAPの投稿を 1 つ見つけました: How to access Object in ViewPartは、私の問題を示唆している可能性があります。

私は Eclipse 3.6.1 を実行していますが、この質問は一般的な Java に関するものだと思います。私の主な問題は、Eclipse プラグイン プロジェクトで別のクラス (クラス B) を使用する 1 つの Eclipse プロジェクトにクラス (クラス A) があることです。Aは、引数の 1 つとして文字列を必要とするクラス B の関数を呼び出すことはできません。クラス B を使用するダミーのクラス C を (ダミーの Java プロジェクトと共に) 生成しましたが、それでも同じ問題が発生します。いくつか詳しく説明しましょう。

Eclipse に 2 つのプロジェクトがあります。それらの 1 つは、本質的にプロッターであり、 org.eclipse.ui.part.ViewPartを拡張するクラスを含む Eclipse プラグイン プロジェクトです。引数の 1 つとして文字列を期待するプロッター クラスからメンバー関数を呼び出すことができない別の非プラグイン プロジェクトからこのプロッター クラスをインスタンス化しています。

たとえば、次のコード スニペット:

Plotter myPlotter = new Plotter();    
myPlotter.plot();

非プラグイン プロジェクトから実行すると正しく動作します。ただし、文字列を期待するようにプロットを変更した場合(たとえば、ラベルの場合)、または文字列を出力する新しい関数を作成した場合:

Plotter myPlotter = new Plotter();
String theString = "I'm the String";
myPlotter.plot(theString);
myPlotter.printMe(theString);

Eclipse では、 printMeプロットの下にエラーを示す赤い下線が表示されます。printMeにカーソルを合わせると、次のエラーが表示されます: タイプ org.eclipse.ui.part.ViewPart を解決できません。必要な .class ファイルから間接的に参照されている

この問題をもう少しよく理解するために、プラグイン プロジェクトに別の 2 つのクラスを作成して問題をテストしました。1 つはスーパークラスがjava.lang.Objectで、もう 1 つはスーパークラスがorg.eclipse.ui.part.ViewPartです。ObjectベースのクラスからString引数を使用して関数を呼び出すことはできますが、 ViewPartベースのクラスから String を引数として関数を呼び出すことはできません。したがって、それは ViewPart と関係があります(クラスがEventManagerから継承されている場合、後続のスーパークラスにドリルダウンできますが、まだ問題があります)。念のため、Vectorを拡張するようにクラスを変更してみましたそして私の問題は消えます。問題がEventManagerおよび/またはViewPartに関連しているように見えます。

どんな洞察も大歓迎です。

4

2 に答える 2

1

これはランタイムの問題ではないため、プログラムの実行方法は問題ではありません。コンパイルエラーが発生します。

Chris Gerken は正しいですが、あなたは彼の解決策を試していないので、彼が正しい理由を説明しようと思います。

Java コンパイラがコードを調べるとき、呼び出すクラスの定義を知る必要があります。場合によっては、継承されたすべてのメンバーの定義も知る必要があります (たとえば、オーバーロードされたメソッド呼び出しを解決する場合)。あなたはその事件に当たったようです。クラスパスにプロッタープロジェクトのみが含まれ、 を定義する jar が含まれていないViewPart場合、このメッセージで失敗します。

クラスパスに正しいjarを追加することで解決できます(定義されているjarを見つけるには、少しいじる必要があります)。それ以外の場合は、プロッタ クラスパス上のすべてのライブラリをエクスポートできます ([プロジェクト プロパティ]/[Java ビルド パス]、[順序とエクスポート] タブ - [すべて選択])。

Chris のソリューションは、プロッター プロジェクトによってホストされる新しいインターフェイス (何も拡張しない) を作成することで、これを回避します。そのインターフェイスを使用しても依存関係はありません (ただし、依存関係を作成できる必要があるため、ファクトリです)。

于 2012-09-17T06:34:27.513 に答える
0

わかった。質問を読んでいると、パーツ自体がクラスパスにあるにもかかわらず、スーパークラス(ViewPart)がクラスパスにないオブジェクトをインスタンス化しようとしています。通常、これは問題にはなりませんが、参照プロジェクトはプラグインではないため、これらの他のクラスを提供するためのPDEコンテナがクラスパスにありません。

クラスを直接インスタンス化するのではなく、プロッタのプラグインのファクトリのようなクラスからインスタンスを取得することをお勧めします。これを行うには:

  • プロッタのプラグインでインターフェイスを作成する
  • プロッタにこのインターフェイスを実装させる
  • ファクトリがインターフェイスのインスタンスを返すようにします。

これにより、やりたいことができるはずです。

ところで...インスタンスは、プロッタで呼び出したいメソッドを定義する必要があります。

于 2012-09-12T21:57:50.197 に答える