Obecnie uczę się języka Java i ostatnio zaskoczyły mnie nawiasy ostre (<>). Co dokładnie mają na myśli?
public class Pool<T>{
public interface PoolFactory<T>{
public T createObject();
}
this.freeObjects = new ArrayList<T>(maxsize)
}
Co to <T>
oznacza? Czy to znaczy, że mogę stworzyć obiekt typu T
?
T createObject
powinien znajdować się w Pool lub PoolFactory? Gdziethis.freeObjects = ...
ma być? Czy to osobny przykład? Posiadanie go tam jest nielegalne; musi znajdować się wewnątrz metody.<>
(operator diamentu), których można by użyć,List<Integer> list = new ArrayList<>();
odwiedź docs.oracle.com/javase/7/docs/technotes/guides/language/… .Odpowiedzi:
<T>
jest typem ogólnym i zwykle można go czytać jako „typu T”. To zależy od typu po lewej stronie <>, co to właściwie oznacza.Nie wiem, co to
Pool
lub aPoolFactory
, ale wspomniałeś równieżArrayList<T>
, że jest to standardowa klasa Java, więc powiem o tym.Zwykle nie zobaczysz tam litery „T”, zobaczysz inny typ. Więc jeśli widzisz
ArrayList<Integer>
na przykład, oznacza to „AnArrayList
zInteger
s”. Na przykład wiele klas używa typów ogólnych do ograniczania typu elementów w kontenerze. Innym przykładem jestHashMap<String, Integer>
„mapa zString
kluczami iInteger
wartościami”.Twój przykład puli jest nieco inny, ponieważ definiujesz klasę. W takim przypadku tworzysz klasę, której instancję mógłby ktoś inny utworzyć z określonym typem zamiast T. Na przykład mógłbym utworzyć obiekt typu
Pool<String>
przy użyciu definicji Twojej klasy. Oznaczałoby to dwie rzeczy:Pool<String>
miałby interfejsPoolFactory<String>
zcreateObject
metodą, która zwracaString
s.Pool<String>
będzie zawierałArrayList
ciąg ciągów znaków.To świetna wiadomość, ponieważ innym razem mógłbym przyjść i stworzyć taki,
Pool<Integer>
który używałby tego samego kodu, ale miałbym goInteger
wszędzie tam, gdzie widziszT
w źródle.źródło
To naprawdę proste. To nowa funkcja wprowadzona w J2SE 5 . Określenie nawiasów kątowych po nazwie klasy oznacza, że tworzysz tymczasowy typ danych, który może zawierać dane dowolnego typu.
Przykład:
Zamiast tego
<T>
możesz napisać wszystko i będzie działać w ten sam sposób. Spróbuj napisać<ABC>
zamiast<T>
.To tylko dla wygody:
<T>
jest określany jako dowolny typ<E>
jako typ elementu<N>
jako typ liczbowy<V>
jako wartość<K>
jako kluczAle możesz nazwać to, co chcesz, to nie ma znaczenia.
Ponadto
Integer
,String
,Boolean
etc są wrapper klasy Java, które pomagają w kontroli typów w czasie kompilacji. Na przykład w powyższym kodzieobj
jest typuString
, więc nie możesz dodać do niego żadnego innego typu (spróbujobj.add(1)
, wyrzuci błąd). Podobnieobj1
jest tegoInteger
typu, nie możesz dodać do niego żadnego innego typu (spróbujobj1.add("hello")
, będzie błąd).źródło
Jest to związane z rodzajami w java. Jeśli wspomniałem
ArrayList<String>
, oznacza to, że mogę dodać tylko obiekt typu String do tej ArrayList.Dwie główne zalety leków generycznych w Javie to:
źródło
nazywa się typem ogólnym. Możesz utworzyć instancję puli obiektów w następujący sposób:
Parametr ogólny może być tylko typem referencyjnym. Nie możesz więc używać typów pierwotnych, takich jak int, double, char lub innych typów pierwotnych.
źródło
<>
służy do wskazania typów ogólnych w Javie.T
jest parametrem typu w tym przykładzie. I nie: tworzenie instancji jest jedną z niewielu rzeczy, których nie można zrobićT
.Oprócz samouczka, do którego link znajduje się powyżej, FAQ Angeliki Langers Generics jest świetnym źródłem informacji na ten temat.
źródło
Klasy ogólne to typ klasy, który podczas tworzenia przyjmuje typ danych jako parametr. Ten parametr typu jest określany za pomocą nawiasów ostrych, a typ może się zmieniać za każdym razem, gdy tworzona jest instancja nowej instancji klasy. Na przykład, stwórzmy ArrayList dla obiektów Pracownika i drugą dla obiektów Firmy
Zauważysz, że używamy tej samej klasy ArrayList do tworzenia obu list i przekazujemy typ Pracownik lub Firma za pomocą nawiasów kątowych. Posiadanie jednej klasy ogólnej obsługującej wiele typów danych ogranicza liczbę klas wykonujących podobne zadania. Typy generyczne pomagają również zmniejszyć liczbę błędów, nadając wszystkiemu silny typ, który pomaga kompilatorowi wskazać błędy. Określając typ ArrayList, kompilator zgłosi błąd, jeśli spróbujesz dodać pracownika do listy firmy lub odwrotnie.
źródło