【问题标题】:Why different result outputs between the generic type and wildcard type为什么泛型类型和通配符类型之间的结果输出不同
【发布时间】:2017-09-04 07:09:15
【问题描述】:

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

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

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

使用通配符?不能成功。

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

【问题讨论】:

标签: java generics polymorphism wildcard


【解决方案1】:

这是因为Message&lt;User&gt; 不是Message&lt;? extends Entity&gt; 的子类。

在尝试实现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>();
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-14
    • 2012-06-12
    • 2019-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多