11 votes

Pourquoi Java n'appellera-t-il pas la méthode (List<Object>), si j'en ai une avec (Object...)?

J'ai la classe suivante qui stocke une liste de tableaux d'objets.

public class Test {
    private List list = new ArrayList();

    public void addList(Object... obj) {
        list.add(obj);
    }

    public void addList(List lst) {
        list.add(lst.toArray());
    }
}

Lorsque j'appelle le suivant, la méthode surchargée addList(Object... obj) est appelée mais je veux que addList(List lst) soit appelée. Comment puis-je faire cela?

public class Main {
    public static void main(String[] args) {
        Test testObj = new Test();
        List myStrings = new ArrayList();
        myStrings.add("string 1");
        myStrings.add("string 2");
        myStrings.add("string 3");

        // La méthode d'argument de variable est appelée mais c'est une liste!
        testObj.addList(myStrings);

    }    
}

8voto

Datajam Points 2770

Changer `List enList` pour capturer des listes de n'importe quel type d'objet. J'ai essayé cela et cela a imprimé "dans List":

import java.util.ArrayList;
import java.util.List;

public class Test {
    private List list = new ArrayList();

    public void addList(Object... obj) {
        System.out.println("dans objet");
        list.add(obj);
    }

    public void addList(List lst) {
        System.out.println("dans List");
        list.add(lst.toArray());
    }

    public static void main(String[] args) {
        Test testObj = new Test();
        List myStrings = new ArrayList();
        myStrings.add("chaîne 1");
        myStrings.add("chaîne 2");
        myStrings.add("chaîne 3");

        // La méthode argument variable est appelée mais c'est une liste !
        testObj.addList(myStrings);

    } 
}``

7voto

user802421 Points 3315

C'est un problème de Java Generic. Vous ne pouvez pas assigner List à `List.

Voir aussi : Java Reference assignment with generic lists

`

7voto

Henning Makholm Points 13132

Réécrivez le type de votre méthode non variadique pour utiliser un joker :

public void addList(List lst) {
    list.add(lst.toArray());
}

Ensuite, List sera un sous-type du type de paramètre.

6voto

Oli Charlesworth Points 148744

List n'est pas une sous-classe de `List. Donc, cette surcharge ne sera jamais appelée, même si vous supprimez la variante...`.

``

2voto

Garrett Hall Points 11902

Changez votre méthode en

public void addList(List lst) {
    list.add(lst.toArray());
}

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