-1

この質問はJava: Using Classes as a value in hashmapに続きます。

次の 2 つのアプローチの違いは何ですか?:

1)

String name = (
                  (
                       CustomClass1
                  )obj1
              ).getName();

および 2)

String name = (
                  (
                       mapQuery2ResponseType.get("string1")
                  )obj1
              ).getName();

どこで、mapQuery2ResponseType.get("string1")型の戻り値Class<?>

最初のアプローチは完全に機能しますが、2 番目のアプローチではエラーが発生しますSyntax error on token "obj1", delete this token

最初のケースのように機能するように、2番目のアプローチ(マップを使用)を変更するにはどうすればよいですか?

の代わりにmapQuery2ResponseType.get("string1")戻すにはどうすればよいですか?CustomClass1CustomClass1.class

4

2 に答える 2

3

キャストはコンパイラへの指示です。実行時までキャスト先のクラスを見つけるのを待つことはできません! 呼び出したときにそのマップから出てくるものが実際に getName() メソッドを持つかどうかをコンパイラが知る方法はありません。

コンパイル時に、マップ共有のすべてのコンテンツを共通のスーパータイプにキャストして、すべてに「getName()」メソッドがあることを確認する必要があります。それが不可能な場合は、メソッドを呼び出すことができるようにメソッドを微調整するために、リフレクションの世界に入ります。

コンパイル時にクラスがわからない場合に、任意のオブジェクトで「getName」メソッドを呼び出す方法についての質問を次に示します 。メソッド名が文字列として与えられたときに Java メソッドを呼び出す方法

メソッドが実際の Bean プロパティの getter および setter である場合は、apache BeanUtils ライブラリを使用して、オブジェクトから名前付きプロパティの値を取得することもできます。

于 2013-03-23T06:26:56.303 に答える
0

MapQuery2ResponseType.get("string1") が CustomClass1.class の代わりに CustomClass1 を返すようにするにはどうすればよいですか?

できません。Java 型キャストには、コンパイル時に認識されるクラス/型が必要です。

次のように、2番目の例がやろうとしているように見えることを実行できるはずです。

1) インターフェイスを宣言します。

    public interface Named {
        String getName();
    }

2) リクエスト タイプ マップ内のすべてのクラスを に変更しimplements Namedます。

3) 上記の「2 番目のアプローチ」のコードを次のように変更します。

    String name = ((Named) obj1).getName();

もう 1 つの方法は、リフレクションを使用して のgetName()メソッドを検索しobj1.getClass()、それを使用method.invoke(...)して呼び出すことです。

于 2013-03-23T07:03:03.890 に答える