2011-12-09 18 views
1

あなたは抽象的な静的メソッドを使用できないことを知っています。私はまた、MyList<T extends ObjectWithId>と言うとき、私のオブジェクトはサブクラスでオーバーライドされる静的メソッドを持つ抽象クラスを持っているので、Tは実行時に存在しないので、静的メソッドをオーバーライドすることは役に立たないことがわかりますObjectWithIdの静的メソッドはサブクラスの代わりに呼び出されます。だからここJavaのジェネリックで静的/静的オーバーライドメソッドを抽象化する代わりに

は私が持っているものです:

ObjectWithIdがある
class PersistentList<T extends ObjectWithId> implements List<T>{ 

} 

abstract ObjectWithId{ 
    public abstract long getId(); 
} 

今、問題はその名の、私のPersistentListは、ハードディスクに保存されることを意図していることで、実際には保持しているオブジェクトのIDのみを格納します。私はPersistentList

@Override 
public T get(int index) { 

} 

メソッドを実装したいときに私のプログラムは、それがindexのために保存されたidを使用してObjectWithIdの各サブクラスで実装される静的メソッドobjectForId(long id)を呼び出すようにするために今、私が欲しいのです。インスタンスメソッドが存在しないため、インスタンスメソッドは使用できません。ポイントは、idを使用してハードディスクからインスタンスをロードすることです。だから、どのように実装する必要がありますか? 1つのオプションは、ObjectWithIdに各サブクラスで実装されたObjectWithId(long id)のコンストラクタを持つことですが、Tは実行時に存在しません。どのようにインスタンス化するのですか?私はPersistentListのコンストラクタにClass<T>オブジェクトを渡すことができますが、コンストラクタに引数がない場合は好きですが、明示的に右に渡さずにTのクラスを取得する方法はないと思いますか?

私はこれがより良い説明であることを望みます。私が始めたあいまいな質問を申し訳ありません。

+0

あなたの質問は本当に「ジェネリックパラメータのタイプを取得するにはどうすればいいですか」ですか?そうであれば、既にこれについて数十もの質問があります。 http://stackoverflow.com/questions/182636/how-to-determine-the-class-of-a-generic-type、http://stackoverflow.com/questions/1372432/how-to-obtain-class- instance-generic-argument-type、http://stackoverflow.com/questions/2223233/how-to-get-generics-class、等 –

答えて

1

Class<T>をコンストラクタ引数として渡しても、実際には問題は解決されません。クラスにアクセスできますが、クラスで定義された静的メソッドにアクセスするには、ジェネリックスを使用する必要があります(他の誰かがClassオブジェクトからクラスで定義された静的メソッドを呼び出す方法を知らない限り)。

私は、ジェネリックメソッドobjectForIDを含む新しい汎用的なインタフェースを定義

public interface ObjectRetriever<T>{ 
    public T objectForID(long aID); 
} 

のようなものやパラメータなどのObjectRetrieverインスタンスを取るためにPersistentListのコンストラクタを調整します。このObjectRetrieverを使用して、IDに基づいてオブジェクトを復元することができます。

+0

申し訳ありませんが、クラスが渡されたことが意味していたので、静的メソッドの代わりにインスタンスを生成するTのコンストラクタを呼び出すことができました。あなたのメソッドはうまくいくかもしれませんが、idはオブジェクトのタイプを教えません。タイプTのそれらのオブジェクトのグループの中のidだけです。あなたのメソッドを使用すると、実行時にTが何であるかはまだ分かりません。どのようなタイプのTに基づいているのか、オブジェクトを処理するための適切なメソッドをどのように呼び出すのでしょうか。 – user1084563

+1

あなたはTが何であるか気にしません。パーシスタントリストを作成するコードのどこにいても、Tのタイプを知っていて、適切な 'ObjectRetriever'インスタンスをコンストラクタに渡します。 PersistentListはランタイム型のTを気にするべきではありません。その関数を呼び出すときに、関数はリストに格納できるT型のオブジェクトを返します。 – Robin

+0

これはうまくいく、ちょうどそこに欲しいリストに何かを渡すことなくこれを行う方法でしたが、リストが既存のリストと単純に交換できるように、リストが通常のリストと同じように機能していれば好きです。あまりにも抽象的な静的メソッドを持つことはできません悪いです。 – user1084563

1

常に静的メソッドでスタートすることが容易に思えますが、私は通常はこのような理由のための静的メソッドを避けるために有益であることが、デフォルトでインスタンスメソッドを使用することを発見しました。

この利点は、拡張性です。継承を許可し、あなたが言及した「制限」を避けることに加えて、後で物事を再設計したりAPIを変更したりすることなく、拡張性を提供します。たとえば、「このクラスは必要なものだけを実行しますが、私はこの1つの機能の部分だけを変更することができます。他の静的メソッドを呼び出す静的メソッドがある場合、これを行う良い方法はありません。すべてのメソッドが静的でない場合、そのクラスをサブクラス化し、必要な機能の一部だけをオーバーライドできます。

静的メソッドに他の(多少関連する)制限は、インターフェイスを実装するために使用できないことです。要するに私は、実行している機能が本当に明確で、代替実装を提供する必要がある将来の実現可能な理由がない「ユーティリティメソッド」のための静的メソッドを予約することを好みます。

+0

私はちょうど私が何を反映するために質問を更新しましたが、探しています。インスタンスがまだ存在しないため、インスタンスを生成するために静的またはコンストラクタを使用する必要があります。 – user1084563

関連する問題