天天看點

Java泛型,如何擷取T的class

public class TypeReference<T> {

    private final Type type;

    protected TypeReference(){
        Type superClass = getClass().getGenericSuperclass();

        type = ((ParameterizedType) superClass).getActualTypeArguments()[0];
    }

    public Type getType() {
        return type;
    }
    
    public final static Type LIST_STRING = new TypeReference<List<String>>() {}.getType();
}



    public static void main(String args[]) {


        List<Integer> list = new ArrayList<>();
        list.add(1);
        list.add(2);
        list.add(3);

        List<Integer> list11 = JSON.parseObject(json, new TypeReference<List<Integer>>(){});

        System.out.println("list11:" + list11);

    }
           
public abstract class Human extends SpiritBase{
    
    private String humanName;

    public String getHumanName() {
        return humanName;
    }

    public void setHumanName(String humanName) {
        this.humanName = humanName;
    }

}

public class RPC extends SpiritBase{

    private String rpcName;

    public String getRpcName() {
        return rpcName;
    }

    public void setRpcName(String rpcName) {
        this.rpcName = rpcName;
    }
}


public abstract class SpiritBase {

    private Integer id;


    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

}
public class SpiritData<T extends SpiritBase> {

    private String id;

    private List<T> data;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public List<T> getData() {
        return data;
    }

    public void setData(List<T> data) {
        this.data = data;
    }

    public Class getDataClass() {
        return (Class) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
    }

    @Override
    public String toString() {
        return "SpiritData{" +
                "id='" + id + '\'' +
                ", data=" + data +
                '}';
    }

    public static void main(String args[]) {

        SpiritData<RPC> data = new SpiritData<RPC>() {};//gson列印不了這樣的

        RPC rpc = new RPC();
        rpc.setRpcName("rpcNameTest");
        List<RPC> rpcList = new ArrayList<>();
        rpcList.add(rpc);
        data.setData(rpcList);
        System.out.println(data);
        System.out.println(data.getData().getClass());
        System.out.println(data.getDataClass());
        System.out.println("gson data:" + JsonUtil.toJSONString(data, 100));
        System.out.println("gson rpc:" + JsonUtil.toJSONString(rpcList));

        System.out.println("data:" + data);
        System.out.println("fastJson:" + JSON.toJSONString(data));


        SpiritData<RPC> rpcData = new SpiritData<RPC>() {};//gson列印不了這樣的
        System.out.println("gson rpc data:" + new Gson().toJson(rpcData));

    }
}