Comment renvoyer différents types d'objet à partir d'une méthode en java?


Je veux vous demander comment une seule méthode peut renvoyer à différents types d'objets en java?

Disons que nous avons une classe "a". la classe a est la classe parente de catégories "b" et "c". disons que nous avons une liste de tableaux définie comme:

java.util.ArrayList<a> list;

Cette liste peut donc contenir des objets de classe a, de classe b et de classe c. disons que nous créons un objet de classe b, et un objet de classe c, et nous les ajoutons à la liste.

Maintenant, je veux créer une méthode comme ceci:

public ? get_element(boolean first)
{
    if (first)
    {
        return list.get(0);
    }
    else
    {
        return list.get(1);
    }
}

Mon problème est, que je je ne sais pas quoi mettre à la place de "?"dans cette méthode. si j'ai mis "un", donc, "public un get_element", lorsque l'élément est retourné, il est toujours de type "a", peu importe si un élément a été à l'origine de type "b" ou "c" lorsqu'il a été ajouté.

Mais je veux que cet élément retourné soit de type element added. donc, si j'ai ajouter un élément de type "b" à l'indice 0 de la liste, et un élément de type "c" à l'index 1, je souhaite quand j'appelle get_element méthode, que si je paramètre égal à "false", qui est retourné l'élément est de type "c", et si je vrai quand je l'appelle, qui a renvoyé l'élément est de type b.

Bien sûr, je peux lancer l'élément retourné au type que je souhaite. mais c'est juste un exemple simple que j'ai écrit, mais j'ai pour de vrai une situation beaucoup plus complexe. j'ai environ 10 classes qui étendent toutes une classe, et une liste de tableaux qui peut contenir l'un de ces 11 types d'objets, et ils peuvent être disposés de n'importe quelle manière, donc je ne peux pas savoir quel type d'élément est à quelle position, à moins que je crée un code qui va essayer de jeter tous les types, un par un jusqu'à trouver celui à qui il peut lancer.

, Mais je veux savoir, est-il une sorte de moyen plus facile de le faire?

Pour simplifier ma question, j'ai écrit ceci .fichier java:

public class test
{
    public static class a{}
    public static class b extends a{}
    public static class c extends a{}
    public static java.util.ArrayList<a> list = new java.util.ArrayList<a>(2);
    static
    {
        b first_object = new b();
        c second_object = new c();
        list.add(first_object);
        list.add(second_object);
        b first_returned_object = get_element(true);
        c second_returned_object = get_element(false);
    }
    public static ? get_element(boolean first)
    {
        if (first)
        {
            return list.get(0);
        }
        else
        {
            return list.get(1);
        }
    }
}

Mon problème est que je ne sais pas quoi mettre avant "get_element" dans la méthode des éléments.

Que dois-je mettre pour pouvoir enregistrer un objet de type b dans "first_returned_object" et un objet de type c dans "second_returned_object"?

Bien sûr, ce n'est qu'un exemple, je n'utiliserais pas ces classes, car elles sont inutiles, mais j'ai écrit ceci pour rendre ma question aussi simple que possible.

Mes vraies classes où j'ai ce genre de problème ont plus de 5000 lignes, donc je ne pouvais pas les inclure ici, alors j'ai écrit la version la plus simple possible qui démontre mon problème.

Des suggestions?

Merci.

Post scriptum: pour les haters de verrouillage des majuscules: votre haine est bidirectionnelle ici. ;)

Author: Amir, 2016-11-19

1 answers

Vous pouvez utiliser des génériques pour rendre le type de retour dynamique.

Essayez celui-ci:

public static <Type> Type get_element(int index)
{
    String s = list.get(index).getClass().toString(); // returns "class class_name"
    String[] split = s.split(" ");
    Class<?> theClass = Class.forName(split[1]); // You need "class_name"

    return (Type) theClass.cast(list.get(index));
}

Ou simplement:

public static <Type> Type get_element(int index)
{
    return (Type) list.get(index);
}
 1
Author: SkrewEverything, 2017-02-08 23:51:09