9

私はこのようなメソッド呼び出しを行おうとしています、

public class GenericsTest<T> {

    public static <T> Map<String, T> createMap(Class<? extends Map<String, T>> clazz) {
        return null;
    }

    public static void main(String[] argv) {
        Map<String, Integer> result = createMap(TreeMap.class);
    }
}

しかし、私はこのエラーを受け取ります、

<T>createMap(java.lang.Class<? extends java.util.Map<java.lang.String,T>>) in test.GenericsTest<T> cannot be applied to (java.lang.Class<java.util.TreeMap>)

この問題を解決するにはどうすればよいですか?

4

1 に答える 1

4
Map<String, Integer> instance = new TreeMap<String, Integer>();

@SuppressWarnings("unchecked")
Map<String, Integer> map =
    createMap((Class<? extends Map<String, Integer>>)instance.getClass());

map.put("x", 1);

System.out.println("THIS IS x: " + map.get("x"));

これにより、1が適切に出力されます。メソッドの実装が最も可能性が高い

try
{
    return clazz.newInstance();
}
catch (Exception e)
{
    throw new RuntimeException(e);
}

APIのより良い実装は、タイプを尋ね、すべての詳細を尋ねるのではなく、選択Tしたものを返すことです。Mapそれ以外の場合は、データが入力されていない限り、次のようにジェネリック型引数を使用してMapをインスタンス化できます。Map

public static <T> Map<String, T> getMap()
{
    return new TreeMap<String, T>();
}

その後、警告なしでそれにアクセスできます。

// note the lack of type arguments, which are inferred
Map<String, Integer> instance = getMap();

// alternatively, you could do it more explicitly:
// Map<String, Integer> instance = ClassName.<Integer>getMap();

実装に完全に一致するものを返すことを除いて、彼らがあなたのClassタイプを尋ねる理由は本当にありません(たとえば、あなたがに固執する場合、あなたは戻ってきます、そしてあなたがに固執する場合、あなたは返されます)。ただし、はそれが構築されたものを失うと思われます。これはの不変( )フィールドであるため、修正することはできません。つまり、その場合は同じではなく、あなたが望むものになる可能性も低いということです。MapHashMapHashMapTreeMapTreeMapTreeMapComparatorfinalTreeMapMap

彼らがMapデータを入力している場合、それはさらに意味がありません。いつでもaのインスタンスを渡して入力するか、単純にラップできるMapaを返すようにすることができ(たとえば)、データに最も有用なものを知っている必要があります。Mapnew TreeMap<String, Integer>(instance);Map

于 2012-07-19T05:35:53.600 に答える