Java (バージョン 6) のテンプレートと静的メソッドに問題があります。
Iterable
まず、反復ごとに抽象クラス (A など) のサブクラス (B など) の新しいインスタンスを作成するテンプレート化された (静的コンテキストから) を返す方法を見つける必要があります。(背景: 1 つのオブジェクト (文字列など) を iterable から別のオブジェクトに変換する必要があります)。テンプレート/ジェネリックを使用する方法を見つけました:
import java.util.HashSet;
import java.util.Iterator;
public class Test {
public static <T extends A> Iterable<T> getIterable(final Iterator<String> i) {
return new Iterable<T>() {
public Iterator<T> iterator() {
return new Iterator<T>() {
public boolean hasNext() {
return i.hasNext();
}
public T next() {
try {
/* this is where things go wrong: *
* T is considered as class A and not B */
return T.factory(i.next());
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public void remove() {
i.remove();
}
};
}
};
}
public static void main(String[] args) {
HashSet<String> st = new HashSet<String>();
st.add("x1");
Iterable<B> bi = getIterable(st.iterator());
for (B b : bi)
{
System.out.println(b);
}
}
}
さらに、次のクラス階層を定義しました。
/* super class */
abstract class A
{
public static <T extends A> T factory(String c)
{
/* returns nothing, should never be called */
return null;
}
}
/* child class */
class B extends A
{
String s;
public B (String s) { this.s = s; }
public static B factory(String s)
{
return new B(s);
}
}
全体的な方法は(原則として)うまくいくようです。ただし、呼び出される静的メソッドは、テンプレートがタイプ B でfactory
あっても、常にスーパー クラス A のものになります。T
サブクラス、つまりテンプレートに付属するクラス<T>
(例: B) のファクトリを呼び出す方法のアイデア/提案を探しています。どんな助けでも大歓迎です!
(注:Java 7では、インターフェイスを使用して静的メソッドを継承/オーバーライドできることがわかりましたが、Java 6にバインドされています...)