[英]Passing an interface implementation as a Spring @RequestBody argument
我有以下课程:
public class ItemController implements ApiController<Item> {
@RequestMapping(value = "/", method = RequestMethod.POST)
public Item create(@RequestBody final CreateItemRequest request) {
// ...
}
}
public interface ApiController<T> {
T create(@RequestBody final ApiRequest request);
}
public class CreateItemRequest implements ApiRequest {
// ...
}
public interface ApiRequest {
// ...
}
Intellij警告我ItemController
不实现ApiController
。 我的工作假设是,作为ApiRequest
的实现, CreateItemRequest
是上面所写的create
方法签名的有效类型。 但是,Intellij坚持request
参数的类型应为ApiRequest
。
我的目标是为诸如CreateItemRequest
类的类实现一个通用接口。 该接口将在ApiController
方法中以通用Y方式进行ApiController
。
显然,我不是泛型向导,所以我在这里混了什么?
编辑: ThingRequest
正确实现ApiRequest
。
更新:
实现接口时,不能缩小方法参数! -的
您有一个interface ApiController<T>
,它的方法为T create(final ApiRequest request)
。 该接口告诉客户端,他可以调用ANY create
的方法!!! 实现类ApiRequest
,因此不允许有一个实现ApiController
制约的参数类型create
于CreateItemRequest
!
旧答案:
你写了:
public interface ApiController<T> {
T create(@RequestBody final ApiRequest request);
}
和
public class ItemController implements ApiController<Item> {
@RequestMapping(value = "/", method = RequestMethod.POST)
public Thing create(@RequestBody final CreateItemRequest request) {
// ...
}
}
一个问题是方法参数, 问题是返回类型! Thing
不是Item
!
好的,您告诉我们这是错字,所以请阅读上面的更新
顺便说一句:我强烈建议将@Override
注释添加到实现/重写其他方法的方法中
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.