日期:2014-05-20  浏览次数:21245 次

java如何传递泛型参数
写了这样一个泛型方法:
Java code

protected <T extends Model> List<T> PostData(String serviceName, SearchInfo info)
            throws ApiException {
//其中builder是一个Json字符串
Type t = new TypeToken<List<T>>() {
            }.getType();

            // Create a new Model from the JSON data.
            List<T> list = new Gson().fromJson(
                    builder, t);
}


Java code

  调用方法是这样调用的this.<AccessStatistics>PostData("test",info)
//其中AccessStatistics是Model的一个子类,info是SearchInfo的实例化对象


调试的时候发现调用方法时给定的泛型参数AccessStatistics根本没有传递进去,不出意料的从Json那里得到的是Object对象
也就是T没有传递进去,而是默认Object进行处理,因为Object是java的顶级类名,救命,求高手解答!

------解决方案--------------------
PostData(String serviceName, SearchInfo info)
方法签名改一下:
PostData(String serviceName, SearchInfo info, Class<T> clazz)
------解决方案--------------------
你敢把 全部代码 或者API都贴出来吗?

this.<AccessStatistics>PostData("test",info)
你这样就已经指明了 T是AccessStatistics类型的,编译的时候,编译器会把T换成AccessStatistics

从你给的代码,看不出问题

就连方法是要有个 List的返回的,你都没return,这要怎么看?
------解决方案--------------------
Java code

package test;

import java.util.ArrayList;
import java.util.List;

public class Node extends IModel{
    
    public static void main(String[] args) throws InstantiationException, IllegalAccessException {
        System.out.println(new Node().<Node>test(Node.class));
    }
    
    public <T extends IModel> List<T> test(Class<T> clazz) throws InstantiationException, IllegalAccessException{
        List<T> list= new ArrayList<T>();
        T obj = clazz.newInstance();
        list.add(obj);
        System.out.println(list.get(0).getClass());
        return list;
    }
    
}

class IModel{
    
}

------解决方案--------------------
List<T> list = new Gson().<AccessStatistics>fromJson(builder.toString(), t);

------解决方案--------------------
错了,第2个参数就是类型了,
你可以换成这个试试
fromJson(JsonElement json, Class<T> classOfT)