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

Mamy następujący,  działający kod:

import java.util.LinkedList;
import java.util.List;

public class GenericsTest {

  public static void main(String[] args) {
    List<Object> list = new LinkedList<Object>();
    list.add("A");
    addToList("B", list);
    System.out.println(list);
  }

  public static void addToList(Object element, List list) {
    list.add(element);
  }
}

W metodzie addToList  pojawiają się ostrzeżenia dotyczące bezpieczeństwa typów. KOd kompiluje się i działa prawidłowo.

Niestety próba wprowadzenia typów generycznych w tej metodzie kończy się błędem kompilacji:

import java.util.LinkedList;
import java.util.List;

public class GenericsTest {

  public static void main(String[] args) {
    List<Object> list = new LinkedList<Object>();
    list.add("A");
    addToList("B", list);
    System.out.println(list);
  }

  public static void addToList(Object element, List<?> list) {
    list.add(element);
  }
}

Co jest przyczyną problemu? Jak można poprawić kod?

 

 

 

 

 

 

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

Odpowiedź (1)

  • 0

Problemem jest próba wstawienia elementu typu Object do kolekcji typu List<?>. Kolekcja może przechowywać elementy konkretnego, nieznanego typu. Typ będzie określony dopiero w momencie wywołania metody.

Załóżmy, że wywołano metodę w następujący sposób:

addToList("abc", new ArrayList<String>());

Wówczas wewnątrz metody nastąpiłaby próba wstawienia referencji typu Object  do kolekcji przechowywującej typy String.

Konieczne byłoby tzw. "rzutowanie w dół", ale typ jest nieznany. Dlatego nie jest możliwe wstawianie elementów do kolekcji z typem generycznym <?>.

Program można poprawić, rezygnując z typów anonimowych:

import java.util.LinkedList;
import java.util.List;

public class GenericsTest {

  public static void main(String[] args) {
    List<Object> list = new LinkedList<Object>();
    list.add("A");
    addToList("B", list);
    System.out.println(list);
  }

  public static <E> void addToList(E element, List<? super E> list) {
    list.add(element);
  }
}

 

 

 

 

 

 

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