7

私はこのようなフィールドを生成したい:

public static Map<String, Class<?>> ID_MAP = new HashMap<String, Class<?>>();

WildcardTypeName.subtypeOf(Object.class) は「?」を与えることができます WildcardTypeName.subtypeOf(Class.class) は「クラス」を与えることができます

4

2 に答える 2

11

その型を構成要素に分解すると、次のようになります。

  • ?
  • Class
  • Class<?>
  • String
  • Map
  • Map<String, Class<?>>

次に、JavaPoet の API を使用して、同じ方法でこれらのコンポーネント パーツを構築できます。

  • TypeName wildcard = WildcardTypeName.subtypeOf(Object.class);
  • TypeName cls = ClassName.get(Class.class);
  • TypeName clsWildcard = ParameterizedTypeName.create(cls, wildcard);
  • TypeName string = ClassName.get(String.class);
  • TypeName map = ClassName.get(Map.class);
  • TypeName mapStringClass = ParameterizedTypeName.create(map, string, clsWildcard);

そのタイプを取得したら、 for と同じことを簡単に行うことができ (にHashMap置き換えるだけです)、フィールドの構築は通常どおりに行うことができます。Map.classHashMap.class

FieldSpec.builder(mapStringClass, "ID_MAP")
    .addModifiers(PUBLIC, STATIC)
    .initializer("new $T()", hashMapStringClass)
    .build();
于 2016-11-09T16:33:17.887 に答える