栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java 如何获取泛型T的T.class当参数

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java 如何获取泛型T的T.class当参数

先说需求,本意是想在父类里面实现一些最基础的方法,然后子类只需要简单的继承,然后就可以有大部分方法可以使用了。我这儿实际就是一个crud的接口,然后给这个接口来个base实现,除非特殊需求,简单继承这个base实现就能实现model的crud。但是呢,find all方法内部需要一个使用另外一个方法,这个方法必须的传入T.class 当参数。看接口和他的base实现

public interface CrudRepository {
    Iterable findAll();
}

public class baseImpl implements CrudRepository {

    @Override
    public Iterable findAll() {
        Class c = getTClass();
        System.out.println(c);

        common(c);
        return null;
    }

    public Iterable findAll(Class c) {
        System.out.println(c);

        common(c);
        return null;
    }

    
    private void common(Class c) {

    }

    
    public Class getTClass() {
        return (Class) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
    }
}

对应的有2个model要实现数据库的crud,Phone 和Computer,具体如下。

@Data
public class Phone {
    private static final long serialVersionUID = 1L;
    private String name;
    private Long price;
    private Long updateDate;
}
public class PhoneRepository extends baseImpl {
}

@Data
public class Computer {
    private static final long serialVersionUID = 1L;
    private String name;
    private Long price;
    private Long updateDate;
}
public class ComputerRepository extends baseImpl {
}

实际测试类,如下:

public class T {
    private final PhoneRepository phoneRepository = new PhoneRepository();
    private final ComputerRepository computerRepository = new ComputerRepository();
    @Test
    public void t() {
        Iterable phones = phoneRepository.findAll();
        phones = phoneRepository.findAll(Phone.class);
        System.out.println();

        Iterable computers = computerRepository.findAll();
        computers = computerRepository.findAll(Computer.class);
        System.out.println();
    }
}

上述代码中,提供了2种方案,

1,硬刚,我就要使用T.class,这个方法还不带参数的,就是我上面base实现类里面的无参数的 findAll()方法,里面提供了获取T.class的方法,获取后,当参数再调用其他的方法。

2,绕一下,把T.class当参数传进去。就是findAll(Class c),这也能实现,稍微绕了点,

1的优点就是直接实现接口,不改接口,不影响已经存在的调用,

2的缺点就是没实现接口,涉及到使用接口提供的findAll()的地方,都得修改,影响范围广

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/355899.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号