1

次のように、さまざまなタイプを Map に格納したいと思います。

public Map< String, Void > common;
MyClass object = new MyClass();
common.put( "Object1", object );

そして、次のように使用します。

Void object = common.get( "Object1" );
( ( MyClass )object ).runAnyFunction();

これは、Void という名前の独自の空のクラスを作成し、Map に配置するすべてのクラスを Void で拡張する場合にのみ機能します。だから問題は解決しました、そうでない限り...

JavaにはすでにVoidがありませんか? 独自の Void クラスを作成しない場合でも機能します。.runAnyFunction() を試みるキャストにたどり着くまで。たぶん、クラスを Void で拡張しようとしたとしますが、それは私が作成した Void でのみ機能し、Java の Void では機能しません。

結局のところ、自分の空の Void クラスを本当に作成する必要があるかどうかにかかっています。または、Java 独自の Void を使用できますか?

4

2 に答える 2

6

なぜオブジェクトを使用しないのですか? すべての Java クラスは、Object から直接的または間接的にサブクラス化されます。

public Map< String, Object > common;
于 2010-11-13T20:34:53.073 に答える
1

この質問をして申し訳ありませんが、なぜこのソリューションを使用するのですか? あるタイプを別のタイプにキャストしたいときはいつでも、立ち止まってデザインについて考え直す必要があると思います。

本当に、メソッド「runAnyFunction()」を実行したいのです。インターフェイスを作成するにはどうすればよいですか

public interface Runner { public void runAnyFunction();

}

マップを Map として定義します。

次に、キャストなしで map.get("foo").runAnyFunction() と言うことができます。

Runner の実装は必要な数だけ作成できます。これはポリモーフィズムと呼ばれ、一般にオブジェクト指向設計です。

次のステップはおそらく、Runnable や Callable などの既存のインターフェースの 1 つを再利用することです。

私は既存のインターフェースのそのような使用法についての短い記事を書いています: http://java.dzone.com/articles/useful-abuse

于 2010-11-13T22:36:09.207 に答える