java如何传递泛型参数

安卓机器人 2011-11-09 10:51:34
写了这样一个泛型方法:

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);
}


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

调试的时候发现调用方法时给定的泛型参数AccessStatistics根本没有传递进去,不出意料的从Json那里得到的是Object对象
也就是T没有传递进去,而是默认Object进行处理,因为Object是java的顶级类名,救命,求高手解答!
...全文
11104 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
安卓机器人 2011-11-09
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 shaosijun2004 的回复:]

List<T> list = new Gson().<AccessStatistics>fromJson(builder.toString(), t);
[/Quote]
感谢你的热心帮忙,但是你真的没仔细看清楚我的要求,要求是传递泛型参数,得到对应泛型参数的List列表,
可能我表达的不是很清楚,但是大概的需求就是这样的
安卓机器人 2011-11-09
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 shaosijun2004 的回复:]

错了,第2个参数就是类型了,
你可以换成这个试试
fromJson(JsonElement json, Class<T> classOfT)
[/Quote]
你又错了,我想要的是List<T>不是Class<T>这不一样
安卓机器人 2011-11-09
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 shaosijun2004 的回复:]

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, Illegal……
[/Quote]
这好像不是我要的答案,虽然object是Node
但是T却还是没有变成想要的Node
shaosijun2004 2011-11-09
  • 打赏
  • 举报
回复
错了,第2个参数就是类型了,
你可以换成这个试试
fromJson(JsonElement json, Class<T> classOfT)
shaosijun2004 2011-11-09
  • 打赏
  • 举报
回复
List<T> list = new Gson().<AccessStatistics>fromJson(builder.toString(), t);
shaosijun2004 2011-11-09
  • 打赏
  • 举报
回复

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{

}




output:
class test.Node
[test.Node@1fb8ee3]
安卓机器人 2011-11-09
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 ncuboy045wsq 的回复:]

引用 3 楼 shaosijun2004 的回复:

你敢把 全部代码 或者API都贴出来吗?

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

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

就连方法是要有个 List的返回的,……
[/Quote]
Gson API是gson-1.7.1.jar
http://code.google.com/p/google-gson/downloads/list
安卓机器人 2011-11-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 shaosijun2004 的回复:]

你敢把 全部代码 或者API都贴出来吗?

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

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

就连方法是要有个 List的返回的,你都没return,这要怎么看?
[/Quote]

StringBuilder builder = new StringBuilder();
reader = new BufferedReader(new InputStreamReader(inputStream));
while ((line = reader.readLine()) != null) {
builder.append(line);
}
out.close();
temp = builder.toString();
Type t = new TypeToken<List<T>>() {
}.getType();
// Create a new Model from the JSON data.
List<T> list = new Gson().fromJson(builder.toString(), t);
return list;
上面这段代码是PostData的方法体,inputStream是从服务器获取的流(是用来json字符串数据的)


public class AccessStatisticsInfo extends Model {

@Override
public void makeValid() {
// TODO Auto-generated method stub

}


public String SourceName;


}

上面这个是AccessStatistics类



public abstract class Model {
/**
* abstract method,subclass implements this method
* to make validation
*/
public abstract void makeValid();
上面这个是Model类

}

其实真的没什么,就是不知道如何传递泛型参数,你说编译器会自动传递泛型,实际上我调试的时候T还是T,不会变成你说的AccessStatistics

安卓机器人 2011-11-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 goldenfish1919 的回复:]

PostData(String serviceName, SearchInfo info)
方法签名改一下:
PostData(String serviceName, SearchInfo info, Class<T> clazz)
[/Quote]
不行,我调用方法Post("Test",info,AccessStatistics.class)还是没有传递进来,大哥你如果做过,就请给我一个例子参考一下吧,谢谢了
shaosijun2004 2011-11-09
  • 打赏
  • 举报
回复
你敢把 全部代码 或者API都贴出来吗?

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

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

就连方法是要有个 List的返回的,你都没return,这要怎么看?
若鱼1919 2011-11-09
  • 打赏
  • 举报
回复
PostData(String serviceName, SearchInfo info)
方法签名改一下:
PostData(String serviceName, SearchInfo info, Class<T> clazz)
安卓机器人 2011-11-09
  • 打赏
  • 举报
回复
求解啊,帮忙啊,谢谢各位了!

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧