为什么泛型和通配符类型输出的结果不同

Why different result outputs between the generic type and wildcard type

我知道泛型和通配符类型有什么区别, 但是在这种情况下我不能再用同样的方式去理解了。

简而言之,比较下面的两个接口

public interface RequestParser {
    <T extends Entity> Message<T> parseRequest(String json);
}


public interface RequestParser {
    Message<? extends Entity> parseRequest(String json);
}

只有第一个可以编译以下代码:(User extends Entity)

Message<User> message = requestParser.parseRequest(json);

使用通配符?不能成功

那么在这种情况下它们之间到底有什么区别...?

因为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>();
    }
}