当前位置: 代码迷 >> J2SE >> java怎么传递泛型参数
  详细解决方案

java怎么传递泛型参数

热度:162   发布时间:2016-04-24 02:17:32.0
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) 
  相关解决方案