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

时间:2017-09-04 07:09:15

标签: java generics polymorphism wildcard

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

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

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);

使用通配符?的人不能成功。

那么在这种情况下他们之间究竟有什么区别......?

1 个答案:

答案 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>();
    }
}