首页新闻找找看学习计划

java 泛型类的方法如何使用Class<T>

0
悬赏园豆:10 [已解决问题] 解决于 2019-04-24 23:34

类似应用场景:

例如 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>?或者有什么类似的方法实现?

Selway的主页 Selway | 初学一级 | 园豆:22
提问于:2019-04-23 16:39
< >
分享
最佳答案
0

改写一下,把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'}

收获园豆:10
无恨之都 | 菜鸟二级 |园豆:277 | 2019-04-24 09:20

谢谢
这样是可以, 但是感觉没有完全发挥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 | 园豆:22 (初学一级) | 2019-04-24 13:08

@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>

无恨之都 | 园豆:277 (菜鸟二级) | 2019-04-24 23:27

@无恨之都:
谢谢,
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 | 园豆:22 (初学一级) | 2019-04-24 23:33

@Selway: 解决了就好,JAVA是通过泛型擦除补偿来实现泛型的,所以一出来就饱受争议,JAVA编程思想作者也抨击过,说这不是真的泛型。但不管它底层怎么实现的,不影响我们使用哈

无恨之都 | 园豆:277 (菜鸟二级) | 2019-04-25 09:38
其他回答(2)
0

列如: object.class

新城V5 | 园豆:195 (初学一级) | 2019-04-23 17:12
0

obj = fromJson(json, parameter.getClass());

狼爷 | 园豆:1192 (小虾三级) | 2019-04-23 19:13

parameter还没实例化怎么调用呢?

支持(0) 反对(0) Selway | 园豆:22 (初学一级) | 2019-04-23 21:52

@Selway: parameter是类里成员变量,构造方法里面传递一下就可以了

支持(0) 反对(0) 狼爷 | 园豆:1192 (小虾三级) | 2019-04-25 10:57
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册