1

プロジェクトの 1 つでジェネリックな静的メソッドを定義したいと考えています。要件は、メソッドの戻り値の型がメソッド パラメータの 1 つであることです。

以下は私の解決策です。

public static <T> List<T> convertMapToAttribute(Class<T> attrClass, T attr) {
    List<T> list = null;
    if (attrClass.equals(String.class)) {
        list = (List<T>) new ArrayList<String>();
        list.add(attr);
    } else if (attrClass.equals(Integer.class)) {
        list = (List<T>)new ArrayList<Integer>();
        list.add(attr);
    }
    return list;
 }

2 つの質問があります。

  1. @SuppressWarnings("unchecked") を追加せずに、この警告「警告: [unchecked] unchecked cast」を回避できますか?
  2. この上記の問題を解決する他のエレガントな方法はありますか
4

4 に答える 4

5

以下はうまくいくはずです:

List<T> list = new ArrayList<T>(); 
List<T> list = new ArrayList<>(); // Java 7
于 2012-10-10T01:28:53.493 に答える
4

次のようなことはできませんでした...

public static <T> List<T> convertMapToAttribute(Class<T> attrClass, T attr) {
    List<T> list = new ArrayList<T>(1);
    list.add(attr);
    return list;
}

代わりは?

フィードバックに基づいて更新

public static <T> List<T> convertMapToAttribute(T attr) {
    List<T> list = new ArrayList<T>(1);
    list.add(attr);
    return list;
}
于 2012-10-10T01:31:11.990 に答える
1

Class<T>パラメーターとして持つことにより、チェックされたキャストを実行する (そして迷惑な警告をスキップする) 方法は、キャストが失敗した場合attrClass.cast()にスローする呼び出しを行うことです。ClassCastExceptionこの場合、は または のTいずれかである必要がありStringますInteger

ここでの問題はT、リストからいずれかのリストへStringの未チェックのキャストを行っていること、またはIntegerリストを直接定義してキャストを使用して要素を追加する必要がある場合です。

if (attrClass.equals(String.class)) {
    List<String> list =  new ArrayList<String>();
    list.add(attrClass.cast(attr));
}

同じことが整数にも当てはまります。

あなたのメソッドには何か奇妙なことがあります(実際には意図がわかりません)、パラメーターも渡している型から要素のリストを作成しています...これもうまくいくはずではありませんか?(タイプのリストを作成し、Tタイプの要素を追加するためT)。

public static <T> List<T> convertMapToAttribute(T attr) {
    List<T> list = new ArrayList<T>();
    list.add(attr);
    return list;
}
于 2012-10-10T01:36:56.013 に答える
0
  1. 私の知る限りではありません

  2. 実際にはメソッドが非ジェネリックになるため、attrClass パラメーターをスキップします。

于 2012-10-10T01:32:06.427 に答える