2

基本的なクラスのセットがあります。ei:

public class Item{ }

Storable 機能を使用して基本クラスを拡張する機能を追加したい:

  1. オブジェクト内のストレージからデータを保持する新しいパラメーター
  2. ストレージからオブジェクトをロードする新しい静的メソッド

抽象クラス Storable を作成しました。

public abstract class Storable{
    private StorageRow str;

    public void setStorageRow(StorageRow row){
        str = row;
    }

    public static ArrayList<? extends Storable> getAll(){
        ArrayList<Storable> ans = new ArrayList<Storable>();
        Class<Storable> extenderClass = ??????


        ArrayList<StorageRow> rows = Storage.get(llallala);
        for(StorageRow row : rows){
            Object extender = extenderClass.newInstance();
            // Now with reflection call to setStorageRow(row);
        }
        return ans;
    }
}

ここで、基本クラスを Storable で拡張します。

public class Item extends Storable{}

呼び出しは次のとおりです。

ArrayList<Item> items = (ArrayList<Item>) Item.getAll();

主な質問は次のとおりです。今、私はスーパークラスの静的メソッド getAll の中にいます。サブクラスを取得するには?

4

1 に答える 1

2

できません。静的メソッドは、その子ではなく、宣言したクラスに属します (継承されません)。したがって、どこから呼び出されたかを知りたい場合は、クラスを引数として渡す必要があります。

public static ArrayList<? extends Storable> getAll(Class<? extends Storable>)

それを行う別のより面倒な方法は、スタック トレースを取得し、どのクラスが呼び出しを行ったかを確認することですが、引数で十分な場合、この種のハックは価値があるとは思いません。

EDIT:スタックトレースを使用した例:

class AnotherClass {

    public AnotherClass() {
        Main.oneStaticMethod();
    }
}

public class Main {

    /**
     * @param args
     * @throws OperationNotSupportedException
     */
    public static void main(final String[] args) {
        new AnotherClass();
    }

    public static void oneStaticMethod() {
        final StackTraceElement[] trace = Thread.currentThread()
                .getStackTrace();
        final String callingClassName = trace[2].getClassName();
        try {
            final Class<?> callingClass = Class.forName(callingClassName);
            System.out.println(callingClass.getCanonicalName());
        } catch (final ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
}
于 2013-04-12T18:10:21.727 に答える