2017-09-04 14 views
1

ジェネリック型とワイルドカード型の違いは何ですか。 ですが、同じ状況で再度理解することはできません。 を(ユーザがエンティティを拡張)ジェネリック型とワイルドカード型の異なる結果が出力される理由

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

、唯一の最初のものは以下のコードをコンパイルすることができる

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


public interface RequestParser { 
    Message<? extends Entity> parseRequest(String 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>(); 
    } 
} 

がコンパイルされます:[PECSは何であるの

public class RequestParserImpl implements RequestParser { 
    Message<? extends Entity> parseRequest(String json) { 
     return new Message<AnotherUser>(); 
    } 
} 
関連する問題