带有Void的java模板形式参数

时间:2014-08-12 05:59:31

标签: java templates generics

我有两个扩展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?

2 个答案:

答案 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> {
    ... 
}

目前,VoidInfo类中的VoidResponseEntityInfoResponseEntity是类型参数 - 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>();
}