2011-01-06 16 views
1

Coobirdのexcellent answerに続いて、私はJavaでリフレクションが正しく動作するようになっています。私は最初にクラスを投稿して詳細に行くでしょう。Javaでリフレクションを使用しているときにキャストできません

私がやろうとしています何StHandler.java

package ds; public interface StHandler { 
public void read(); 
} 

DiStHandler.java

package ds; 
public class DiStHandler { 
public void read() { 
System.out.println("Hello world"); 
} 

Server.java

package ds; 
public class Server { 
public static void main(String[] args) { 
try { 
Class<?> clazz = Class.forName("ds.DiStHandler"); 
StHandler input = (StHandler) clazz.newInstance(); 
input.read(); 
} 
catch(Exception e) {} 
} 

:私は、インターフェイスStHandlerを、持っています私はひとつのメソッドread()を使いたいと思っています。 DiStHandlerは、クラスパスから利用可能な実装クラスです。私はここからreadメソッドを呼び出そうとしています。

問題:ライン

StHandler input = (StHandler) clazz.newInstance(); 

に私はエラーが発生します:ds.DiStHandler cannot be cast to ds.StHandler

私は今、約2時間のためにこれをデバッグしようとしているが、私の人生は何が出て働くことができないためにされています問題は。私がDiStHandlerにimplements StHandlerを持っていない理由は、別のプロジェクトでDiStHandlerを作成しているからです。

私はこれに関するアドバイスをいただき、誠にありがとうございます。事前に非常に おかげで、

M

答えて

8

あなたはそのインターフェイスを実装していないStHandlerDiStHandler場合にDiStHandlerをキャストすることはできません。反射はタイプシステムを覆すことはできません。すべてがタイプセーフでなければなりません。

StHandlerを実装できない場合は、DiStHandler(アダプタクラス)を呼び出す必要があります。

+0

Mm私はそう思いました.DiStHandlerと同じプロジェクトにインターフェイスクラスStHandlerを置き、DiStHandlerを実装しコンパイルしたら結果のファイルからDiStHandler.classを取り出しますか?返信いただきありがとうございます。 :) – Myn

+0

@ミン:あなたのために何がうまくいくのかは分かりません.... – skaffman

+0

おそらく..私はコードの締め切りに反対していますので、私はすぐに実装する方法を探していますAPIの機能性は、これがうまくいくかどうかを見ることに非常に興味があります。そうでない場合は、アダプタクラスを試してみます。再度、感謝します。 – Myn

0

あなたは

The reason I don't have

を書くDiStHandlerはStHandlerあなたはまだ、この構文を使用することができます別のプロジェクトである場合であってもStHandler

is because I'm creating DiStHandler in a separate project.

を実装しています。実際、プロジェクトを分割するのは良い設計です。もしそうならば、依存関係を管理するためのmavenのようなツールを見るべきです - あなたのDiStHandlerはStHandlerのに従います。あなたのツールチェーンにmavenを入れるとすぐにモジュール性の面で返済されます

関連する問題