我有两个扩展ResponseEntity的实体:
public class VoidResponseEntity<Void> extends ResponseEntity<Void> {
... }
public class InfoResponseEntity<Info> extends ResponseEntity<Info> {
... }
public class Info {
long id
}
在我的另一种方法中,我应该返回其中一个:
public <T extends ?????> ResponseEntity<T> foo(...) {
if (condition1) {
return new InfoResponseEntity<Info>(new Info());
}
return new VoidResponseEntity<Void>();
}
我应该写什么而不是&#34; ?????&#34;在方法签名,通配符? 或者只是T?
答案 0 :(得分:1)
如果您的方法决定了响应实体类型,我怀疑您的方法首先不应该是通用的:
public ResponseEntity<?> foo() {
if (condition1) {
return new InfoResponseEntity<Info>(new Info());
}
return new VoidResponseEntity<Void>();
}
换句话说,你的foo
方法是说“我返回某种类型的响应实体,但我不能在编译时告诉你它将是什么类型的参数。 “
此外,听起来你的具体课程不应该是通用的 - 它们应该是:
public class VoidResponseEntity extends ResponseEntity<Void> {
...
}
public class InfoResponseEntity extends ResponseEntity<Info> {
...
}
目前,Void
和Info
类中的VoidResponseEntity
和InfoResponseEntity
是类型参数 - 不 Void
和{ {1}}我怀疑你希望他们成为的课程。
答案 1 :(得分:0)
根据JavaDoc,如果您使用的方法&#34; foo&#34;作为控制器,您应该传递ResponseEntity而不是Type参数。
源ResponseEntity的示例。
@RequestMapping("/handle")
public ResponseEntity<String> handle() {
HttpHeaders responseHeaders = new HttpHeaders();
responseHeaders.set("MyResponseHeader", "MyValue");
return new ResponseEntity<String>("Hello World", responseHeaders, HttpStatus.CREATED);
}
所以在你的情况下,这个方法应该是这样的(如果我之前的假设对这个问题是正确的)
public ResponseEntity<?> foo(...) {
if (condition1) {
return new InfoResponseEntity<Info>(new Info());
}
return new VoidResponseEntity<Void>();
}