2

何らかの計算を行うメソッドを定義するインターフェースがあります

public interface Computable { 
    public Result compute(Foo foo);
}

また、引き剥がすことができる一連の引数を計算に渡したいと思います。genericsこれをハックすることはできますが、 andを使用したエレガントなソリューションがあるかどうか疑問に思っていvar argsます。何かのようなもの...

 public class Parameter<K,V> {

    private final K key;
    private final V value;

    public Parameter(K key, V value) {
        this.key = key;
        this.value = value;
    }

    public K getKey() {
        return this.key;
    }

    public V getValue() {
        return value;
    }    
}

しかし、パラメータのリストから各パラメータをどのように調べれば、推定されたタイプのキーと値のペアを簡単に取得できるかわかりません。誰かが私を助けることができますか?これはまだJDKに組み込まれていませんか?

例で編集:

具体的な実装では....

public Result compute(Foo foo,
                      Parameter ...parameters) {

    // Here I'd like to get each parameter, and have it know it's key type and value type
    for(Parameter p : parameters) {
        p.getKey();
        p.getValue()
        //implementers know what to do with their parameters
    }


}
4

2 に答える 2

3

コメントで AmitD が述べたようにComputableパラメータ化された型を作成する必要があります。

public interface Computable<K, V> { 
    public Result compute(Foo foo, Parameter<K, V>... parameters);
}

その後、実装が解決さKV、型が認識されます。

public class BarBazComputable implements Computable<Bar, Baz> {
    @Override
    public Result compute(Foo foo, Parameter<Bar, Baz>... parameters) {
        ...
    }
}

編集:はい、AmitD が再び述べたように、型パラメーターのいずれかまたはすべてを解決する必要はありません。

public class WithStringComputable<K> implements Computable<K, String> {
    @Override
    public Result compute(Foo foo, Parameter<K, String>... parameters) {
        ...
    }
}

public class OhJustACoupleObjectsComputable<K, V> implements Computable<K, V> {
    @Override
    public Result compute(Foo foo, Parameter<K, V>... parameters) {
        ...
    }
}

public class NumbersComputable<N1 extends Number, N2 extends Number> implements Computable<N1, N2> {
    @Override
    public Result compute(Foo foo, Parameter<N1, N2>... parameters) {
        ...
    }
}

varargs はジェネリクスとうまく機能しないことに注意してくださいcompute. 代わりに、メソッドにIterable<Parameter<K, V>>.

于 2012-11-08T05:57:04.063 に答える
1

さまざまなパラメーターまたはさまざまな値の型に対してさまざまなキーの型がある場合、単純な汎用 varargs 関数定義ではおそらくこれを解決できないでしょう。あなたの唯一の型安全なオプションは、次のようなものになります:

public Result compute(Foo foo, Parameter<Byte, Byte> p1, Parameter<Byte, Float> p2, ...)

(ここで "..." は、varargs の省略記号ではなく、同じ方法で追加された追加のパラメーターを示します)

.

ただし、柔軟にする必要があり、パラメーターの他のプロパティを調べることで、扱っているキーと値の型を判断できる場合は、型キャストを単純化するために私が時々使用するトリックがありますgetKey()Parameterこれに:

@SuppressWarnings("unchecked")
public <KeyType> KeyType getKey() {
    return (KeyType) this.key;
}

(getValue() 関数についても同様)

getKey()そうすれば、次のように、の結果を任意の (非プリミティブ) 型の変数に割り当てることができます。

Integer key = parameter.getKey();

また

String key = parameter.getKey();

計算関数で型キャストを行う必要はなく、警告もありません。

ただし: コンパイル時の型チェックが失われます。したがって、間違った型の変数にキーを割り当てないように、実行時に確認する必要があります (いずれにせよ必要になる場合があります)。または、少なくとも結果の ClassCastException を適切に処理します。

于 2012-11-08T06:54:40.033 に答える