2010-01-03 6 views
2

Je suis un peu nouveau dans la fonction Java Generics. Pouvez-vous s'il vous plaît aidez-moi à comprendre pourquoi l'extrait de code ci-dessous ne fonctionne pas:Un problème avec le type de valeur de retour paramétré

interface Response {} 
interface Request<T extends Response> {} 

class TestResponse implements Response {} 
class TestRequest implements Request<TestResponse> {} 

<T extends Response> T foo(Request<T> b) { 
    TestResponse tr = new TestResponse(); 
    return tr; 
} 

Tout semble bon pour moi: le type de valeur de retour implémente l'interface de réponse, cependant, le compilateur est en désaccord: « Incompatibilité de type: ne peut pas convertir TestResponse à T »

+0

Je pense que vous avez des problèmes avec le mot-clé implements/extends. Dans la méthode, le type T est censé étendre Response, mais votre TestResponse implémente Request (dont le type peut s'étendre de Response). Je pense que vos interfaces et vos caractères joker de type pourraient être faits d'une autre manière. –

Répondre

4

Imaginons l'utilisation suivante de votre API:

OtherRequest<OtherResponse> req = new OtherRequest<OtherResponse>(); 
OtherResponse res = foo(req); 

Vous voyez le problème? Votre implémentation renvoie un TestResponse, qui n'est pas une sous-classe de OtherResponse.

Questions connexes