2009-01-08 5 views
2

Je me suis efforcé pendant un certain temps d'essayer de définir une interface générique, mais je ne parviens pas à réaliser ce que je veux. Ce qui suit est un exemple simplifié du problème.Problème de définition d'une interface générique

Disons que j'ai un générique message classe

public class Message<T> { 

    private T content; 

    public void setContent(T content) { 
     this.content = content; 
    } 

    public T getContent() { 
     return content; 
    } 

} 

et je veux définir une interface pour les choses transfering:

public interface Transfer<Message<T>> { 

    public void send(Message message); 

} 

Le problème est que le compilateur n'accepte pas , et se plaint toujours de le deuxième caractère '<', peu importe quelles variations j'essaie. Comment spécifier cette interface pour qu'elle soit liée à un type générique (basé sur Message) et avoir également accès au type paramétré?

Mon plan était d'utiliser cette interface comme ce qui suit:

public class Carrier<Message<T>> implements Transfer<Message<T>> { 

    public void send(Message message) { 
     T content = message.getContent(); 
     print(content); 
    } 

    public static void print(String s) { 
     System.out.println("The string equals '" + s + "'"); 
    } 

    public static void print(Integer i) { 
     System.out.println("The integer equals " + i); 
    } 

    public static void main(String[] args) { 
     Carrier<Message<String>> stringCarrier = new Carrier<Message<String>>(); 
     Message<String> stringMessage = new Message<String>("test"); 
     stringCarrier.send(stringMessage); 

     Carrier<Message<Integer>> integerCarrier = new Carrier<Message<Integer>>(); 
     Message<Integer> integerMessage = new Message<Integer>(123); 
     integerCarrier.send(integerMessage); 
    } 
} 

je l'ai fait quelques recherches et lire (entre autres Angelika's generics faq), mais je ne suis pas en mesure de dire si cela est impossible ou si Je le fais mal.

Mise à jour 2009-01-16: suppression de l'utilisation originale de la « chose » au lieu de « message < T> » (qui a été utilisé parce qu'avec que j'ai pu compiler sans obtenir des erreurs de syntaxe sur l'interface).

+0

Cette question est-elle résolue ou non? On dirait que Jon Skeet l'a compris, mais vous n'avez pas marqué sa réponse comme acceptée. –

Répondre

5

Il me semble que vous voulez:

public class Carrier<Thing extends Message<Foo>, Foo> 
    implements Transfer<Thing> 

De cette façon, le compilateur saura que thing est un Message<Foo> et aura donc une méthode getContent().

Vous devrez l'utiliser comme:

Carrier<Message<String>, String> 

Mais vous avez actuellement obtenu un peu d'une déconnexion. Vous implémentez Transfer<Thing> mais vous essayez d'utiliser thing comme si c'est un Message<Thing> regardez votre méthode send - vous l'appelez avec une chaîne et un entier. Ces classes n'ont pas de méthodes getContent().

Je pense que vous devriez effectivement être implémentez Transfer<Message<Thing>> au lieu de Transfer<Thing>

+0

Oui, bingo! Je veux définir l'interface comme "Transfert >" et c'était ma première approche. Cependant, quand j'essaie que le compilateur donne toujours une erreur de syntaxe sur la seconde " était la seule façon dont j'ai eu quelque chose à compiler. – hlovdal

+0

Alors pourquoi n'avez-vous pas accepté cette réponse? –

0

Quelle que soit la façon dont vous résoudre votre problème de génériques, votre code ne compilera pas parce que vous ne disposez pas d'une méthode d'impression qui prend un type de T en tant que paramètre .

Je crois que vous devrez faire l'exemple des contrôles si vous voulez la fonctionnalité que vous recherchez. Donc, je ne pense pas que vous obtenez une valeur du type générique dans ce cas.

0

Vous devez uniquement spécifier T pour la classe, puis utiliser le message < T> pour vos types argument/retour.

public interface Transfer<T> { 
    public void send(Message<T> message); 
} 

La raison pour laquelle vous n'utilisez pas un message < T> est parce que vous fournissez le contexte « ceci est un message » dans vos arguments et types de retour.

Questions connexes