1

あるジェネリック型から別のジェネリック型に変換するいくつかのメソッドを持つクラスがありますが、引数の型と戻り値の型が同じ場合は元の値を返したいと考えています。私が思いついた最良のオプションは、引数の型をキャストし、それを try catch ステートメントでラップすることでしたが、それは私には汚いように思えます。

public WK wrapKey(K key) {...


public abstract class MyClass<K, V extends Comparable, WK, WV> extends BaseClass<Map<WK, WV>, KeyValueBean<K, V>> {

...
public WK wrapKey(K key) {

    try {
        return (WK) key;
    } catch (Exception e) {
        return null;
    }
}

public WV wrapValue(V value) {

    try {
        return (WV) value;
    } catch (Exception e) {
        return null;
    }
}

もう 1 つのオプションは、クラスの型をコンストラクターまたはセッター メソッドの引数として指定し、次に isAssignableFrom を使用することであると考えました。

public WV wrapValue(V value) {
  if (value.class.isAssignableFrom(this.getWrappedValueClass())){
     return WK(V);
  }
  return null;
}

他の方法はありますか??

4

1 に答える 1

2

Java は型消去によってジェネリックを実装します。つまり、すべての型チェックはコンパイル時に実行され、ジェネリックは実行時に消去されます。このため、以下のコードは実際には何もしません。

public WV wrapValue(V value) {
    try {
        return (WV) value;
    } catch (Exception e) {
        return null;
    }
}

実行時には、これは次と同等です。

public Object wrapValue(Object value) {
  return value;
}

このメソッドが例外をスローすることはありません。代わりに、このメソッドの呼び出し元が例外をスローする可能性があります。これは、コンパイラが呼び出しサイトに暗黙的なキャストを追加するためです。

あなたができないので、あなたの2番目の例はコンパイルさえしませんvalue.class。このチェックを行う場合は、両方のクラス タイプを渡す必要がVあります。KV

いずれにせよ、あなたの設計は非常に複雑に見えます。おそらく、何をしようとしているのかを説明すれば、より良い解決策があるかもしれません。

于 2012-09-23T02:39:03.050 に答える