nawiasy ostre w javie

0

Wiem że temat trochę dziwaczny ale na prawdę nie wiem jak to inaczej nazwać.
Szukałem w google trochę po omacku bo nie wiem za bardzo czego he he
a rozchodzi się o taki oto zapis :

 ArrayList<String> list = new ArrayList<String>();

a konkretniej o te Stringi w nawiasach, jeśli ich nie ma nic nie mogę odczytać ArrayList.
Fragment kodu wygląda tak :

ArrayList<String> list = new ArrayList<String>();
 	list.add("add do tablicy");
	System.out.println(list.get(0));

Do czegoś takiego dochodziłem boleśni i po woli ale w końcu zadziałało nie mam tylko pojęcia co to oznacza, jeśli wiecie co ten zapis oznacza albo chociaż jak się to nazywa to proszę napiszcie będę wdzięczny za informację.

A i jeszcze jedno podczas kompilacji dostaje taki komunikat :

Note: heloword.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.

nie przeszkadza to w działaniu programu ale chyba wskazuje na jakiś potencjalny błąd.

0

Kryje się pod tym tajemnicze słowo Generics :)

0

Jeśli chcesz się dowiedzieć co jest potencjalnie niebezpieczne, to zgodnie z otrzymanym komunikatem skompiluj tak: javac -Xlint NazwaKlasy

0

poczytaj o typach generycznych, na szybko oznacz to ze w liscie przechowywane sa obiekty typu String, jezeli chcesz to ominac to mozesz zrobic tak:

ArrayList list = new ArrayList();
list.add("add do tablicy");
System.out.println((String)list.get(0));

(lista przechowuje typ Object, trzeba wiec rzutowac na String przy wyciaganiu)

0

@mic4u
W podanym przez przykładzie nie trzeba rzutować, można tak

   System.out.println(list.get(0));

(funkcja pritln() dopuszcza dowolny obiekt jako argument i używa jego metody toString())
Rzutowanie jest natomiast konieczne w takiej np. sytuacji:

  String s=(String)list.get(0));
  // String s=list.get(0); jest błędne
0
  1. Kompilator mówi prawdę. Ten kod bez generyków nie jest bezpieczny ze względu na typy.
    Generyki powinno się stosować zawsze gdy jesteśmy pewni klay obiektu.

  2. Zamiast

ArrayList<String> list = new ArrayList<String>();

dużo lepiej

List<String> list = new ArrayList<String>();
bogdans napisał(a)

Rzutowanie jest natomiast konieczne w takiej np. sytuacji:

  String s=(String)list.get(0));
  // String s=list.get(0); jest błędne

Nieprawda.
Taki kod jest w 100% poprawny. Przestanie być poprawny, gdy usuniemy generyki

List<String> list = new ArrayList<String>();
String s = list.get(0);
0

@__krzysiek85, ja odpowiadałem @m1c4u, który pisał o sytuacji bez generyków. Jest zatem oczywistą oczywistością, że ja również pisałem o takiej sytuacji.

0

Ja nie rozumiem tylko, dlaczego obiekt ArrayList przechowywać w referencji typu List? Co prawda możemy wtedy sobie zmienić rodzaj tablicy, ale tak czy siak - mamy dostępne mniej metod.

0

O czym ty mówisz ???

0
krzysiumed napisał(a)

Ja nie rozumiem tylko, dlaczego obiekt ArrayList przechowywać w referencji typu List? Co prawda możemy wtedy sobie zmienić rodzaj tablicy, ale tak czy siak - mamy dostępne mniej metod.

Może kiedyś będziesz chciał zmienić ArrayList na LinkedList i będziesz miał problem jeżeli w całym kodzie używałeś jako typu klasy ArrayList zamiast interfesju List.
ArrayList dodaje tylko dwie metody ensureCapacity i trimToSize. Jeszcze nigdy ich nie użyłem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1