类似应用场景:
例如 json反序列化的方法是这样的:
public static <T> T fromJson(String json, Class<T> classOfT)
泛型类是这样的
public class ReqBody<T> {
private T parameter;
/**
* 使用json反序列化赋值 ,这里怎么能用这个方法?
*/
pub ReqBody(string json){
parameter = fromJson(json, ???);
}
}
上面类的内部如何使用Class<T>?或者有什么类似的方法实现?
改写一下,把Class传进去:
public class ReqBody<T> {
private Class<T> clzz;
/**
* 使用json反序列化赋值 ,这里怎么能用这个方法?
*/
public ReqBody(String json,Class<T> clzz){
this.clzz = clzz;
T obj = (T) JSONObject.parseObject(json,clzz);
System.out.println(obj);
}
public static void main(String[] args) {
ReqBody<Parameter> reqBody = new ReqBody<>("{\"path\":\"The path param\"}",Parameter.class);
}
}
class Parameter {
private String path;
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
@Override
public String toString() {
return "Parameter{" +
"path='" + path + '\'' +
'}';
}
}
输出:
Parameter{path='The path param'}
谢谢
这样是可以, 但是感觉没有完全发挥class<T>中T的意义。
另外,还遇到一个问题
这样的方法要怎么调用呢?
public <T extends Parameter> ReqBody<T> getReqBody(Class<ReqBody<T>> tClass)
{
return fromJson(bodyJson, tClass);
}
下面的写法都报错
//这样编译器无法推断类型
req.getReqBody(ReqBody.class);
//这样又提示语法错误
req.getReqBody(ReqBody<Parameter>.class);
还是,我上面定义的方法就有问题呢?
@Selway: T是发挥了的,在构造ReqBody时就将T所要代表的具体类型传入,这样你后面才能对指定的T类型进行反序列化:
public static void main(String[] args) {
Class<Parameter> clzz = Parameter.class;
ReqBody<Parameter> reqBody = new ReqBody<>("{"path":"The path param"}",clzz);
}
public <T extends Parameter> ReqBody<T> getReqBody(Class<ReqBody<T>> tClass) {}
根据你的定义所表现出来的意图是你要返回的类型是ReqBody包装的类,且被包装的类是Parameter的子类,所以返回的结果大概是这个样子才对:ReqBody<ParameterSubClass>
@无恨之都:
谢谢,
ReqBody<ParameterSubClass>
是不行的,
我改成这样了
public <T extends ResBody> ReqBody getReqBody(Class<T> tClass)
{
return fromJson(bodyJson, tClass);
}
//这样调用自然就认识ReqBody<Parameter> 了。
ReqBody<Parameter> body = getReqBody(ReqBody.class);
P.S. java里的泛型应该是假泛型太难用了,不如C#的好用。
@Selway: 解决了就好,JAVA是通过泛型擦除补偿来实现泛型的,所以一出来就饱受争议,JAVA编程思想作者也抨击过,说这不是真的泛型。但不管它底层怎么实现的,不影响我们使用哈
列如: object.class
obj = fromJson(json, parameter.getClass());
parameter还没实例化怎么调用呢?
@Selway: parameter是类里成员变量,构造方法里面传递一下就可以了