La différence entre la Liste, List<?>, List<T>, une Liste<E>, et une Liste<Object>

Quelles sont les différences entre List, List<?>, List<T>, List<E>, et List<Object>?

Maintenant, je n'ai pas aveuglément poser cette question, donc merci de ne pas fermer ce fil. Permettez-moi d'abord introduire le code de base:

private static List<String> names = new ArrayList<String>();
static {
    names.add("Tom");
    names.add("Peter");
    names.add("Michael");
    names.add("Johnson");
    names.add("Vlissides");
}

public static void test(List<String> set){
    System.out.println(set);
}
public static void main(String args[]){
    test(names);
}

Je comprends que:

1.List: est une crue de type, donc pas typesafe. Il ne fera que générer une erreur d'exécution lors de la coulée est mauvais. Nous voulons une erreur de compilation quand le plâtre est mauvais. Recommandé de ne pas utiliser.

2.List<?>: est une surabondance de génériques. Mais vous ne savez pas ce que c'est pour? Donc si je change le test méthode pour

public static void test(List<?> set){
    System.out.println(set);
}

il fonctionne toujours bien. Si vous pouvez expliquer l'utilisation de cette application, je vous en serais très reconnaissante.

MODIFIER: Si je fais ceci:

public static void test(List<?> set){
    set.add(new Long(2)); //--> Error
    set.add("2");    //--> Error
    System.out.println(set);
}

mais si je change test à ceci:

public static void test(List<String> set){
    set.add(new Long(2)); //--> Error
    set.add("2");    //--> Work
    System.out.println(set);
}

3.List<T>:

public static void test(List<T> set){   //T cannot be resolved
    System.out.println(set);
}

Je suppose que je ne comprends pas cette syntaxe. J'ai vu quelque chose comme ça, et ça fonctionne:

public <T> T[] toArray(T[] a){
    return a;   
}

Veuillez l'expliquer moi s'il vous plaît? Parfois, je vois <T>, ou <E>, ou <U>, <T,E>. Sont-ils tous les mêmes ou qu'elles ne représentent quelque chose de différent?

4.List<Object>

public static void test(List<Object> set){
    System.out.println(set);
}

Puis j'ai eu l'erreur The method test(List<Object>) is not application for the argument List<String> pour le code ci-dessous. Je suis confus. J'ai pensé String est un sous-ensemble de Object?

public static void main(String args[]){
    test(names); 
}

EDIT: Si j'essaie ce

test((List<Object>)names);

puis j'ai eu Cannot cast from List<String> to List<Object>

  • Aucune infraction, mais je pense que vous avez besoin de passer du temps à apprendre sur les médicaments génériques en Java.
  • Ne vous en faites pas
  • si vous pouvez consulter un livre ou de ressources en ligne que vous avez lu et que vous ne comprenez pas l'explication, il y a environ vos points, alors je voudrais répondre à votre question. Demander quel est le differenc entre la Liste<T> Liste<E> est la même chose que se demander quelle est la différence entre int a; et int b;
  • J'ai vraiment envie d'apprendre, et je ne veux pas débattre avec vous sur si ma question est large ou pas? Donc, je suis désolé que je pose cette question trop vaste question, et en quelque sorte de vous ennuyer beaucoup. Toutefois, si vous insistez sur elle. Alors je suis de lecture Efficace Java par Joshua Bloch, sur le point 23, 24. Même si, c'est un grand livre, l'explication est un peu dur pour moi de comprendre. Et quand j'essaie d'écrire des codes pour confirmer mon comprendre, je ne comprends pas les questions ci-dessus. Encore une fois, mes présenté des excuses.
  • Efficace Java suppose que vous connaissez les notions de base sur les génériques. Bon endroit pour commencer est: http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html, Java Génériques et Collections formulaire de nick naftalin, ou si vous aimez la bonne combinaison de l'approche théorique et pratique, de lire Le Langage de Programmation Java 3e éd
  • De Cirkel, angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html le lien est en bas.
  • s'il vous plaît ne pas le nom de List comme set 🙁

InformationsquelleAutor Thang Pham | 2011-06-03