Search code examples
javajavapoet

JavaPoet - ParameterizedTypeName with nested ParameterizedTypeName


How can I create following:

HashMap<String, Pair<Boolean, Object>> mHashMap = new HashMap();

I have following:

ParameterizedTypeName subType = ParameterizedTypeName.get(Pair.class, Boolean.class, Object.class);
ParameterizedTypeName mainType = ParameterizedTypeName.get(HashMap.class, String.class, Pair.class);
 builder.addField(
            FieldSpec.builder(mainType, "mHashMap", Modifier.PRIVATE, Modifier.FINAL)
                    .initializer("new HashMap<>()")
                    .build()
    );

How can I now combine the subType with the mainType to get the correct mainType?

I need something like following:

ParameterizedTypeName mainType = ParameterizedTypeName.get(HashMap.class, String.class, subType);

Solution

  • Something like this should work:

    ParameterizedTypeName subType = ParameterizedTypeName.get(Pair.class, 
                                                              Boolean.class,
                                                              Object.class);
    ClassName string = ClassName.get("java.lang", 
                                     "String");
    ClassName hashMap = ClassName.get("java.util", 
                                      "HashMap");
    ParameterizedTypeName mainType = ParameterizedTypeName.get(hashMap, 
                                                               string,
                                                               subType);
    
    FieldSpec.builder(mainType, 
                      "mHashMap",
                      Modifier.PRIVATE,
                      Modifier.FINAL)
             .initializer("new HashMap<>()")
             .build();
    

    The code above should generate:

    private final HashMap<String, Pair<Boolean, Object>> mHashMap = new HashMap<>();
    

    Hope that helps.