1

この簡単な例のように、テスト値をクラスに入れる必要があります。

import java.util.List;
import java.util.Map;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
public class TestVal {
  private static Map<Class<?>, Object> dummyValues = Maps.newHashMap();
  static {
    dummyValues.put(String.class, "Banana");
    dummyValues.put(Integer.class, 42);
  }
  @SuppressWarnings("unchecked")
  static final <T> T ofType(Class<T> type) {
    return (T) dummyValues.get(type);
  }
  public static void main(String[] args) {
    List<? extends Object> list =
        Lists.newArrayList(ofType(String.class), ofType(Integer.class));
    for (Object object : list) {
      System.out.printf("%s: %s%n", object, object.getClass().getName());
    }
  }
}

一度実行すると、次のようになります。

Banana: java.lang.String
42: java.lang.Integer

したがって、「基本」システムとしては問題ありません。

しかし、もっとタイプセーフが欲しいです。

私はGuavaを研究しようとしていましImmutableClassToInstanceMapたが...少し難しいと思います.このメソッドシグネチャを見てください:

public static
    <B, S extends B>
        ImmutableClassToInstanceMap<B>
            copyOf(
                Map<? extends Class<? extends S>,
                ? extends S> map
            )

残忍ですね。「任意の」タイプにどのように使用しますか? GoogleのWikiで例を見ませんでした..

上記のように「一所懸命」ではなく、「一段上」に進むことはできますか?同じことを行う別の明白な方法がありませんか?

4

1 に答える 1

8

え?あなたがする必要がImmutableClassToInstanceMapあるのは次のようなものです

ImmutableClassToInstanceMap<Object> map = ImmutableClassToInstanceMap
  .builder()
  .put(String.class, "foo")
  .put(Integer.class, 42)
  .build();

そして、あなたはただ電話map.getInstance(String.class)して出て行きますString

のジェネリックcopyOf()は複雑ですが必要ですが、この場合は、代わりにビルダーを使用することをお勧めします。

于 2012-10-08T23:20:07.920 に答える