各位大神早上好,请看我的问题:
@Data
public class Car{
private String id;
private int status;
}
@Data
public class RedCar extends Car{
}
@Data
public class YellowCar extends Car{
}
RedCar、YellowCar 是 Car 的子类,正常情况下可以使用如下方法引用:queryWrapper.lambda().eq(RedCar::getId,1)
下面我创建了一个BaseCarController ,RedCarController、YellowCarController 都继承于它
public class BaseCarController<T extends Car> {
@Autowired
CommonService cs;
public void test(int id) {
cs.toggle(id, T::getStatus);
}
}
public class RedCarController extends BaseCarController<RedCar> {
}
public class YellowCarController extends BaseCarController<YellowCar> {
}
原本以为:
调用 RedCarController 的 test 方法,应该执行的是cs.toggle(id, RedCar::getStatus);
调用 YellowCarController 的 test 方法,应该执行的是cs.toggle(id, YellowCar::getStatus);
但是发现 BaseCarController.class 文件中 T::getStatus 变成了Car::getStatus
导致 cs.toggle 方法中 mybatis-plus 没有成功更新对应的表。
请问这种情况怎么解决呢,怎么实现我上面的预期效果呢?
另外,如果我只有一个 redCar 对象RedCar redCar = new RedCar();
有没有什么方法,可以通过 redCar 这个对象达到 RedCar::getStatus 这个效果呢,类似如下:cs.toggle(id, 【通过redCar获取RedCar::getStatus】);
在我的认知中,实例方法是不能直接作为参数传递的。所以我很好奇
CommonService.toggle
是怎么定义的。假如我的认识无误,那说明getStatus
是个静态方法。静态方法没有继承关系,在定义 BaseCarController 的时候,就已经决定了它是哪个类的静态方法。另外,从 Java 泛型具有类型擦除特性来说,T
的信息也是不会被保留使用的测试代码:
生成 .class 之后再反编译出来是这样的
可以看到,直接就是传入的
Car::getStatus
,在基类定义的时候并不知道会有哪些子类,而子类中也没有重载test()
定义,所以只能找到Car::getStatus
。如果改成实例 Lambda(需要实例对象)应该可以达到你的要求。示例代码: