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

悠悠 2022-08-28 00:39 276阅读 0赞

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

  1. public interface CrudRepository<T> {
  2. Iterable<T> findAll();
  3. }
  4. public class BaseImpl<T> implements CrudRepository<T> {
  5. @Override
  6. public Iterable<T> findAll() {
  7. Class<T> c = getTClass();
  8. System.out.println(c);
  9. common(c);
  10. return null;
  11. }
  12. public Iterable<T> findAll(Class<T> c) {
  13. System.out.println(c);
  14. common(c);
  15. return null;
  16. }
  17. /**
  18. * 通用的方法使用泛型的class去干一些事情。
  19. *
  20. * @param c 泛型类
  21. */
  22. private void common(Class<T> c) {
  23. }
  24. /**
  25. * 获取 T.class
  26. *
  27. * @return T.class
  28. */
  29. public Class<T> getTClass() {
  30. return (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
  31. }
  32. }

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

  1. @Data
  2. public class Phone {
  3. private static final long serialVersionUID = 1L;
  4. private String name;
  5. private Long price;
  6. private Long updateDate;
  7. }
  8. public class PhoneRepository extends BaseImpl<Phone> {
  9. }
  10. @Data
  11. public class Computer {
  12. private static final long serialVersionUID = 1L;
  13. private String name;
  14. private Long price;
  15. private Long updateDate;
  16. }
  17. public class ComputerRepository extends BaseImpl<Computer> {
  18. }

实际测试类,如下:

  1. public class T {
  2. private final PhoneRepository phoneRepository = new PhoneRepository();
  3. private final ComputerRepository computerRepository = new ComputerRepository();
  4. @Test
  5. public void t() {
  6. Iterable<Phone> phones = phoneRepository.findAll();
  7. phones = phoneRepository.findAll(Phone.class);
  8. System.out.println();
  9. Iterable<Computer> computers = computerRepository.findAll();
  10. computers = computerRepository.findAll(Computer.class);
  11. System.out.println();
  12. }
  13. }

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

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

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

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

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

发表评论

表情:
评论列表 (有 0 条评论,276人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java 如何获取TT.class参数

    先说需求,本意是想在父类里面实现一些最基础的方法,然后子类只需要简单的继承,然后就可以有大部分方法可以使用了。我这儿实际就是一个crud的接口,然后给这个接口来个base实现,