Kategorie szkoleń | Egzaminy | Kontakt
  • 1
  • 0
  • 63

Co jest nadtypem dla wszystkich kolekcji generycznych?

Załóżmy, że mamy następującą metodę do wypisania wszystkich elementów kolekcji:

public static void printCollection(Collection c) {
  for (Object element : c) {
    System.out.print(element + " ");
  }
  System.out.println();
}

Jak należy zmienić sygnaturę metody, aby jej argumentem była kolekcja generyczna?

 

 

  • Zapytał
  • @ | 29.11.2015
  • TRENER MODERATOR ALTKOM AKADEMII

Odpowiedź (1)

  • 0

Sprawdźmy najpierw działanie istniejącego kodu. Test wygląda następująco:

import java.util.Arrays;
import java.util.Collection;

public class Test {
  public static void printCollection(Collection c) { // ostrzeżenie: Collection is a raw type
    for (Object element : c) {
      System.out.print(element + " ");
    }
    System.out.println();
  }

  public static void main(String[] args) {
    Collection<String> sc = Arrays.asList("aaa", "bbb", "ccc");
    printCollection(sc); // wypisuje: aaa bbb ccc 
    Collection<Integer> ic = Arrays.asList(111, 222, 333);
    printCollection(ic); // wypisuje: 111 222 333
  }

}

Jak widać metoda działa poprawnie z dowolnym typem kolekcji (także generycznej).

Próba "ulepszenia" metody poprzez zmianę sygnatury na następującą:

public static void printCollection(Collection<Object> c)

zakończy się błędami kompilacji w wierszach, gdzie metoda jest wywoływana...

Jest to spowodowane tym, że typ Collection<Object> nie jest nadtypem ani dla Collection<String>, ani dla Collection<Integer> - są to całkowicie różne typy.

Do reprezentacji dowolnego typu generycznego służy tzw. dzika karta <?>

Następująca zmiana powoduje, że kod ponownie kompiluje się i wykonuje poprawnie:

import java.util.Arrays;
import java.util.Collection;

public class Test {
  public static void printCollection(Collection<?> c) { // brak ostrzeżenia
    for (Object element : c) {
      System.out.print(element + " ");
    }
    System.out.println();
  }

  public static void main(String[] args) {
    Collection<String> sc = Arrays.asList("aaa", "bbb", "ccc");
    printCollection(sc); // wypisuje: aaa bbb ccc 
    Collection<Integer> ic = Arrays.asList(111, 222, 333);
    printCollection(ic); // wypisuje: 111 222 333
  }

}

 

 

 

 

 

 

 

 

  • Odpowiedział
  • @ | 29.11.2015
  • TRENER MODERATOR ALTKOM AKADEMII