2 votes

Correspondance entre un paramètre et un type de retour à l'aide de généricité

Le type de retour peut-il correspondre au type de paramètre en utilisant des éléments génériques ?

Exemple de cas :

J'ai une classe abstraite qui sera implémentée pour importer des données à partir de différents POJO, cette classe contient une méthode abstrcacte importData.

L'objet renvoyé par importData doit être du même type que l'objet transmis à la méthode.

public abstract POJO importData(final POJO dataObject, final String messageId);

Comme le type Object est différent pour chaque implémentation de la méthode abstraite et que le type n'en étend pas un autre, comment la méthode abstraite peut-elle être définie de telle sorte que le type de retour des implémentations et le type transmis DOIVENT correspondre ?

Editer :

Testé et éprouvé :

public abstract <T> T importData(final T jaxbObject, final String messageId);

Résultat :

Le type de retour de la méthode ne doit pas nécessairement correspondre au type de l'objet transmis.

2voto

Leviand Points 1986

Vous devez attribuer une lettre à votre type de classe, qui sera attribuée lorsque votre méthode sera utilisée, en fonction du type que vous utilisez lorsque la méthode est appelée.

public abstract T importData(final T dataObject, final String messageId);

Vous pouvez alors, dans votre implémentation, vérifier le type de votre objet pour différents comportements

YourAbstractClass c = new YourAbstractClass() {
            @Override
            public <T> T importData(T dataObject, String messageId) {
                if(dataObject instanceof String){
                    //doSomething
                }else if (dataObject instanceof POJO){
                    //do POJO things
                }
                return null;
            }
        };

2voto

Lino Points 13360

Vous pouvez utiliser un paramètre générique au niveau de la méthode :

public abstract <T> T importData(final T dataObject, final String messageId);

Attention toutefois, ce type de T peut varier pour chaque appel effectué. Par exemple, les appels suivants sont possibles :

POJO myPojo = myClass.importData(otherPojo, "messageId");
Integer someInt = myClass.importData(5, "otherMessageId");
String aSring = myClass.importData("Hello World", "anotherMessageId");

Si ce n'est pas ce que vous voulez, vous pouvez utiliser la suggestion d'un paramètre générique au niveau de la classe en @Leviand .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X