1

setDefaultRendererJTable のメソッドと同様の機能を持つクラスに取り組んでいます。Classオブジェクトを表示に適した文字列に変換する固有のフォーマッターが必要です。

public interface Formatter<T> {
    String format(T value);
}

private Map<Class<?>, Formatter<?>> formatters;

public <T> void addFormatter(Formatter<T> formatter) {
    formatters.put(T.class, formatter);
}

それは私が今持っているコードですが、Java は受け入れませんT.class

error: cannot select from a type variable
        formatters.put(T.class, formatter);
                        ^
1 error

Class<T>別のパラメーターを渡さずにこれを記述する方法はありますか? 私はそれを避けようとしています。冗長なようです。

4

6 に答える 6

1

一般的には不可能です。ただし、あなたの場合は、コードの代わりに使用できるメソッドをFormatter実装することが合理的かもしれません。Class<T> getFormatterTargetClass()T.class

于 2013-07-24T18:19:22.270 に答える
1

これはJava言語では不可能です。すべてのジェネリック型はコンパイル時に決定されるため、実行中にクラス値にアクセスすることはできません。Class<T>したがって、アクセスできるようにするには、パラメーターも渡す必要があります。

public Class MyGenericClassContainer<T>{

    public T instance;

    public Class<T> clazz;

    public MyGenericClassContainer(Class<T> clazz){
        intance = clazz.newInstance();
    }

}
于 2013-07-24T18:15:29.423 に答える
1

有益な演習は、「ジェネリックなしでこれを行うにはどうすればよいか」と自問することです。それに対する答えは、あなたの質問に対する答えでもあります。

ジェネリックを含むプログラムは、ジェネリックを削除して適切な場所にキャストを挿入することにより、コード内の他の何も変更せずに、ジェネリックを使用しない同等のプログラムに書き込むことができます。この変換は「型消去」と呼ばれます。これは、ジェネリックなしでは何かを記述できない場合、ジェネリックを使用しても記述できないことを意味します。

ジェネリックがない場合、コードは次のようになります。

public interface Formatter {
    String format(Object value);
}

private Map formatters;

public void addFormatter(Formatter formatter) {
    formatters.put(?, formatter);
}

それで、私はあなたに尋ねます、あなたはそれをどのようにしますか?

于 2013-07-24T21:11:48.787 に答える