2017-09-04 28 views
1

我知道泛型类型和通配符类型 之间有什么区别,但在这种情况下,我不能再以相同的方式再次理解。泛型类型和通配符类型之间为什么不同结果输出

对于短,给两个接口比较下面

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

一个使用通配符?不能成功。

那么在这种情况下他们之间究竟有什么不同呢?

+2

的【什么是佩奇可能的复制(生产者扩展消费超)? ](https://stackoverflow.com/questions/2723397/what-is-pecs-producer-extends-consumer-super) – Flown

+0

在这种情况下,你想使用产生的价值,因此它也是一个消费者(链接在重复) – Flown

+0

糟糕,PECS这个词我从未听过,谢谢。 –

回答

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>(); 
    } 
} 
相关问题