先说需求,本意是想在父类里面实现一些最基础的方法,然后子类只需要简单的继承,然后就可以有大部分方法可以使用了。我这儿实际就是一个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
1的优点就是直接实现接口,不改接口,不影响已经存在的调用,
2的缺点就是没实现接口,涉及到使用接口提供的findAll()的地方,都得修改,影响范围广



