4

コンストラクターに渡すパラメーターのネイティブ型に基づいて、オブジェクトを動的に拡張しようとしています。
私はいくつかのJavaジェネリックとワイルドカードのものを読みましたが、良いアプローチを見つけることができないようです。

説明のための擬似コード:

public class myClass extends <?> {
    // Constructor
    public myClass(<?> param) {
    }
}

ある種のビルダークラスを使用する必要がありますか?もしそうなら、私はこれをどのようにレイアウトしますか?

編集:
私は自分のアプローチがかなり悪いと感じたので、ここで尋ねました。さらに説明するには:

私は多くのサブインターフェースを備えたインターフェースを持っており、そのうちのいくつかはサブインターフェースも持っています。私の目的では、スーパーインターフェイスはAPIであるため、メソッドを追加するために編集することはできません。サブインターフェイスの1つを渡すイベントがあります。これは、より多くのメソッドとプロパティを持つ自分のオブジェクトにキャストできるようにしたいのですが、それでもサブインターフェイスのメソッドにアクセスしたいのです。

たとえば、サブインターフェイスはエンティティと呼ばれます。私ができることはmyClass extendedEntity = new myClass(entity)、私が公開したい新しいメソッドを持っています。渡されたサブインターフェイスをオブジェクトのプロパティにするとextendedEntity.entity.originalMethod()、サブインターフェイスに含まれているメソッドにアクセスできます。extendedEntity.originalMethod()しかし、私はそれと同様にそれを持ちたいですextendedEntity.addedMethod()

これは誰にとっても意味がありますか、そして私が行方不明になっていることを私ができることは明らかですか?(機械エンジニアとして教育を受けたJavaは趣味なので、許してください!)

4

3 に答える 3

1

Genericsは、クラスを拡張するためのものではありません。クラスが特定のクラス(またはクラスのセット)を処理することを指定するためのものです。たとえば、の代わりにを格納List<String>するです。ListStringObject

また、ジェネリックはコンパイル時にのみ使用されます。あなたが求めているものがサポートされていたとしても、実行時にそれは次のように終了します

  public class myClass extends Object {
    public myClass(Object param) {
    }
  }
于 2012-11-23T09:58:28.403 に答える
1

ジェネリックスについて心配する代わりに、デリゲートパターンを調べてみませんか?extendedEntityは、実装し、渡されたものをプライベートフィールドにEntity格納し、すべてのメソッド呼び出しをそのフィールドに委任できます。それはそれ自身のインターフェース上であなたが望むどんな追加のメソッドも持つことができます。entityEntity

キャスティングがどのように機能するかをよく理解しているかどうかはわかりません。あるオブジェクトを別のオブジェクトに魔法のように変えることはありません。キャストは、がすでにタイプ(またはサブタイプ)であるA a = (A) b場合にのみ機能します。bA

于 2012-11-23T10:33:39.983 に答える
0

この問題を解決するには、実行時にコードをコンパイルするのが妥当と思われます。また、昔、 BCELを聞いたことがありますが、それもご覧いただけます。

于 2012-11-23T09:58:04.223 に答える