我知道泛型类型和通配符类型之间有什么区别, 但在这种情况下,我再也不能用同样的方式来理解。
简而言之,要比较下面的两个接口
public interface RequestParser {
<T extends Entity> Message<T> parseRequest(String json);
}
public interface RequestParser {
Message<? extends Entity> parseRequest(String json);
}
只有第一个可以编译以下代码:(用户扩展实体)
Message<User> message = requestParser.parseRequest(json);
使用通配符?
的人不能成功。
那么在这种情况下他们之间究竟有什么区别......?
答案 0 :(得分:1)
这是因为Message<User>
不是Message<? extends Entity>
的子类。
尝试实施RequestParser
时,问题会更明显。
如果没有演员,这将失败,因为T
不一定是AnotherUser
:
public class AnotherUser extends Entity {}
public class RequestParserImpl implements RequestParser {
<T extends Entity> Message<T> parseRequest(String json) {
return new Message<AnotherUser>();
}
}
这将编译:
public class RequestParserImpl implements RequestParser {
Message<? extends Entity> parseRequest(String json) {
return new Message<AnotherUser>();
}
}