2016-11-09 49 views
4

我想產生這樣一個領域: '?'如何生成符號類<?>與javapoet

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

WildcardTypeName.subtypeOf(Object.class)可以給 WildcardTypeName.subtypeOf(Class.class)可以給 '類'

回答

6

如果你打破這種類型的成組成部分您將獲得:

  • ?
  • 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);

一旦你的類型,做同樣的HashMap應該很容易(只更換Map.classHashMap.class),然後建設領域可以像正常進行。

FieldSpec.builder(mapStringClass, "ID_MAP") 
    .addModifiers(PUBLIC, STATIC) 
    .initializer("new $T()", hashMapStringClass) 
    .build(); 
+2

對不起,我不能找到ParameterizedTypeName.create(XX,XX)在ParameterizedTypeName.java –

+1

使用'ParameterizedTypeName.get()' –

3

使用ParameterizedTypeName.get()爲我工作 - 由我使用

public static void main(String[] args) throws IOException { 

    TypeName wildcard = WildcardTypeName.subtypeOf(Object.class); 

    TypeName classOfAny = ParameterizedTypeName.get(
      ClassName.get(Class.class), wildcard); 

    TypeName string = ClassName.get(String.class); 

    TypeName mapOfStringAndClassOfAny = ParameterizedTypeName.get(ClassName.get(Map.class), string, classOfAny); 

    TypeName hashMapOfStringAndClassOfAny = ParameterizedTypeName.get(ClassName.get(HashMap.class), string, classOfAny); 

    FieldSpec fieldSpec = FieldSpec.builder(mapOfStringAndClassOfAny, "ID_MAP") 
      .addModifiers(Modifier.PUBLIC, Modifier.STATIC) 
      .initializer("new $T()", hashMapOfStringAndClassOfAny) 
      .build(); 

    TypeSpec fieldImpl = TypeSpec.classBuilder("FieldImpl") 
      .addModifiers(Modifier.PUBLIC, Modifier.FINAL) 
      .addField(fieldSpec) 
      .build(); 

    JavaFile javaFile = JavaFile.builder("com", fieldImpl) 
      .build(); 

    javaFile.writeTo(System.out); 
} 

進口 -

import com.squareup.javapoet.*; 
import javax.lang.model.element.Modifier; 
import java.io.IOException; 
import java.util.HashMap; 
import java.util.Map; 

這將生成輸出 -

package com; 

import java.lang.Class; 
import java.lang.String; 
import java.util.HashMap; 
import java.util.Map; 

public final class FieldImpl { 
    public static Map<String, Class<?>> ID_MAP = new HashMap<String, Class<?>>(); 
} 
+1

是,這個效果很好 –

+0

@dongsheng如果這有助於。請接受它作爲答案。 :) – nullpointer

相關問題