4

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にバインドされています...)

4

1 に答える 1

3

Java キーワードstaticには、コンパイラーにとって意味があります。これにより、コンパイラーは、コンパイル時にメソッド呼び出しをメソッドに静的にバインドできます。したがって、コンパイラは、行をコンパイルするときに、生成されたバイト コードにメソッドへの呼び出しを書き込みます。A.factory(String)return T.factory(i.next()).

B のファクトリ メソッドをオーバーライドして、プログラムの実行時に動的な動作をさせたいと思ったことは明らかです。その動作については、staticキーワードを削除する必要があります。

于 2013-07-12T12:17:33.827 に答える