2

特定のコレクションに多数のオブジェクトMyClassを設定するための静的メソッドを持つ抽象クラスがあります。このメソッドは、オブジェクト インスタンスを取得するためにの静的メソッドMyClassDescendantを呼び出す必要があります。getRandom()MyClassDescendant

私の現在のコードは次のようになります。

public static void populate(Collection<MyClass> coll, Class<? extends MyClass> cl, int num) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
    for (int i = 0; i < num; i++) {
        Method m;
        m = cl.getMethod("getRandom");
        coll.add((MyClass)(m.invoke(null)));
    }
}

それから私はそれを次のように呼びます:

MyClass.populate((Collection<MyClass>)(Collection<?>)collection, MyClassDescendant.class, 3);

このコードは機能しますが、醜いです。私が実際に達成したかったことは次のようになります。

MyClassDescendant.populate(collection, 3);

静的メソッドでない場合は、this.getClass(). MyClass.classそれが静的メソッドで機能することはわかっていますclassMyClass、特定のメソッドでは必要ありませんMyClassDescendant(子孫の型はほとんどありません)。

インスタンスまたはクラス名を持たずにクラスオブジェクトを取得する方法はありますか?

4

3 に答える 3

1

静的コンテキストにいるため、一部のコードを複製する必要がありますが、委任を行うことができます。

public class MyClassDescendant extends MyClass {
    public static void populate(Collection<MyClass> coll, int count) {
        MyClass.populate(coll, MyClassDescendant.class, count);
    }
}

今、あなたは呼び出すことができます MyClassDescendant.populate(collection, 3);

于 2013-03-27T19:34:22.610 に答える
0

get random が静的メソッドである場合、それを呼び出すことはできませんか?

public interface MyClassInterface { 
    MyClass getRandom();
}

public abstract class MyClass implements MyClassInterface {
    public static void populate(Collection<MyClass> coll, int num) {
        for (int i = 0; i < num; i++) {            
            coll.add((MyClass)MyClassDescendant.getRandom());
        }
    }
}

public class MyClassDescendant extends MyClass {
    public MyClass getRandom() {
        // implementation of getRandom
    }
}
于 2013-03-27T18:26:38.440 に答える
0

この方法でメソッドを再構築してみてください。

public static <T extends Base> void populate(Collection<T> coll, int num) throws Exception{
    for (T item : coll) {
        Method m;
        m = item.getClass().getMethod("getRandom");
        coll.add((T)(m.invoke(null)));
    }
}

コメントの 1 つに関しては、テンプレート メソッドデザイン パターンを使用して、getRandom()メソッドを抽象化し、populate メソッド内で呼び出すことにより、メソッドの継承を利用することもできます。

于 2013-03-27T18:35:58.633 に答える