申し訳ありませんが、私の問題をより核心的に、またはより抽象的に説明することはできません。私の問題を説明する最良の方法は、この非常に具体的な例を使用することだと思います。
関数の呼び出し方法に基づいて、文字列を解析し、特定のタイプの特定のコレクションを提供する関数'readCollection'を定義したいと思います。
たとえば、私はそれをそのように使用したいと思います:
ArrayList<Foo> fb = readCollection("Foo1\n Foo2\n Foo3\n");
また
LinkedList<Bar> fb = readCollection("Bar1\n Bar2\n Bar3\n");
もちろん、1つのインスタンス( "Bar ..")を読み取るための'read'メソッドを持つすべてのクラスのインターフェイスを定義しました。
私はいくつかの問題の間に挟まれています:
-当然、関数readCollectionは静的関数である必要がありますが、インターフェイスに静的メソッドを含めることはできません。
-メソッドreadCollectionは、FooやBarなどのタイプの新しいオブジェクトを返す必要がありますが、readCollectionを定義したクラスで一般的に定義されているタイプをインスタンス化できません。
-メソッドが静的に定義されていない場合、そのタイプの特定のオブジェクトを参照せずにメソッドを呼び出すことはできません。これは、前のポイントのために行うことはできません。
FooやBarなどごとにコピーせずにメソッドを作成するにはどうすればよいですか?
私は自分で解決策を見つけたようですが、それは非常に醜くて厄介です。
私は今持っています
public interface Readable<T> {
public T read(String str); }
と
public class ReadCollection<T extends Readable<T>> {
public Collection<T> read(File file, Collection<T> ts, T t) {
...
ts.add(t.read(strLine));
...
return ts;
} }
と
public class Bars extends ReadCollection<Bar>{
...
public static void main(String[] args) {
new Bars().read(new File("fake/path"), new ArrayList<Bar>(), new Bar()); }
ここでは、メソッド'read'を参照するために、結果をBarに返すために、ArrayListの新しいインスタンスを送信しました。どうすればそれを回避できたのかわかりません。
もっと良い方法があると教えてください。どこかで私は後知恵で非常に愚かであると感じたいです。