2011-07-07 19 views
88

Obecnie studiuję na Javie i ostatnio zostałem zakłopotany przez nawiasy kątowe (<>). Co dokładnie mają na myśli?Co oznacza <T> (nawiasy ostrokątne) w języku Java?

public class Pool<T>{ 
    public interface PoolFactory<T>{ 
     public T createObject(); 
    } 
    this.freeObjects= new ArrayList<T>(maxsize) 
} 

Co oznacza <T>? Czy to oznacza, że ​​mogę utworzyć obiekt typu T?

+8

google java generics –

+4

Ciężko jest sparsować twój kod. Nie ma wcięć na początek, a są dwa otwarte klamry i tylko jeden blisko. Czy 'T createObject' powinien znajdować się wewnątrz Pool lub PoolFactory? Gdzie jest "this.freeObjects = ..."?Czy to jest osobny przykład? Jest tam nielegalne; musi być wewnątrz metody. – mgiuca

+0

Jeśli ktoś szuka informacji o '<>' (operator diamentu), który mógłby być użyty jak 'Lista list = new ArrayList <>();' odwiedź https://docs.oracle.com/javase/7/docs /technotes/guides/language/type-inference-generic-instance-creation.html. – Pshemo

Odpowiedz

4

<> służy do oznaczania generics w Javie.

T to parametr typu w tym przykładzie. I nie: tworzenie instancji jest jedną z niewielu rzeczy, których nie można wykonać przy użyciu z .

Oprócz samouczka połączonego powyżej Angelika Langers Generics FAQ jest świetnym źródłem informacji na ten temat.

6

to typ ogólny. Można utworzyć instancję Pula obiektów:

PoolFactory<Integer> pool = new Pool<Integer>(); 

Parametr ogólny może być tylko typem odniesienia. Nie można więc używać typów pierwotnych, takich jak int, double, char lub innych typów pierwotnych.

101

<T> to rodzajowy i zazwyczaj można go odczytać jako "typu T". Zależy to od typu na lewo od tego, co w rzeczywistości oznacza.

Nie wiem, co to jest Pool lub PoolFactory, ale wspominasz również o ArrayList<T>, która jest standardową klasą Java, więc porozmawiam z tym.

Zazwyczaj nie zobaczysz tam "T", zobaczysz inny typ. Jeśli widzisz na przykład ArrayList<Integer>, oznacza to "An ArrayList z Integer s." Wiele klas używa generycznych, aby na przykład ograniczyć typ elementów w kontenerze. Innym przykładem jest HashMap<String, Integer>, co oznacza "mapę z kluczami String i wartościami Integer."

Twój przykład Pool jest nieco inny, ponieważ istnieje definiująca klasę jako. Tak więc w tym przypadku tworzysz klasę, którą ktoś inny mógłby utworzyć z konkretnym typem zamiast T. Na przykład mógłbym utworzyć obiekt typu Pool<String> używając definicji klasy. Oznaczałoby to dwie rzeczy:

  • My Pool<String> miałyby interfejs PoolFactory<String> z createObject metody zwracającej String s.
  • Wewnętrznie, Pool<String> będzie zawierać ArrayList ciągów.

To wspaniała wiadomość, ponieważ w innym czasie, mogę przyjść i stworzyć Pool<Integer> które mogłyby użyć tego samego kodu, ale mają Integer gdziekolwiek zobaczyć T w źródle.

16

Jest związany z rodzajami leków w Javie. Jeśli wspomniałem ArrayList<String> oznacza to, że mogę dodać tylko obiekt typu String do tej tablicy ArrayList.

Dwie główne zalety rodzajowych w Javie są:

  1. Zmniejszenie liczby rzutów w programie, zmniejszając tym samym liczbę potencjalnych błędów w programie.
  2. Poprawa pisaniu przejrzystego kodu
1

klasy generyczne są rodzajem klasy, która odbywa się w typ danych jako parametr, gdy jest tworzony. Ten parametr określa się za pomocą nawiasów ostrych, a typ może się zmieniać za każdym razem, gdy tworzone jest nowe wystąpienie klasy. Na przykład, stwórzmy ArrayList dla obiektów pracownikiem a inny dla Spółki obiektów

ArrayList<Employee> employees = new ArrayList<Employee>(); 
ArrayList<Company> companies = new ArrayList<Company>(); 

Zauważysz, że używamy tej samej klasy ArrayList do tworzenia zarówno list i mijamy się pracownika lub firmy typu przy użyciu kąta nawiasy. Posiadanie jednej klasy ogólnej jest w stanie obsłużyć wiele typów danych, ograniczając liczbę klas wykonujących podobne zadania. Generyki pomagają także ograniczyć błędy, nadając wszystkim silny typ, który pomaga kompilatorowi wskazać błędy. Po określeniu typu obiektu ArrayList kompilator zgłosi błąd, jeśli spróbujesz dodać pracownika do listy firm lub odwrotnie.

10

To naprawdę proste. Jest to nowa funkcja wprowadzona w J2SE 5. Określenie nawiasów klamrowych po nazwie klasy oznacza, że ​​tworzysz tymczasowy typ danych, który może pomieścić dowolny typ danych.

Przykład:

class A<T>{ 
    T obj; 
    void add(T obj){ 
     this.obj=obj; 
    } 
    T get(){ 
     return obj; 
    } 
} 
public class generics { 
    static<E> void print(E[] elements){ 
     for(E element:elements){ 
      System.out.println(element); 
     } 
    } 

    public static void main(String[] args) { 
     A<String> obj=new A<String>(); 
     A<Integer> obj1=new A<Integer>(); 
     obj.add("hello"); 
     obj1.add(6); 
     System.out.println(obj.get()); 
     System.out.println(obj1.get()); 

     Integer[] arr={1,3,5,7}; 
     print(arr); 
    } 
} 

Zamiast <T>, rzeczywiście można napisać coś i będzie działać w ten sam sposób. Spróbuj wpisać <ABC> zamiast <T>.

To jest po prostu dla wygody:

  • <T> jest określany jako wszelkiego rodzaju
  • <E> jako element typu
  • <N> jako typ numeru
  • <V> jako wartość
  • <K> jako klucz

Ale możesz nazwać to, co chcesz, to naprawdę nie ma znaczenia.

Ponadto, Integer, String, Boolean itd. To klasy języka Java, które pomagają w sprawdzaniu typów podczas kompilacji. Na przykład w powyższym kodzie obj jest typu String, więc nie można dodać do niego żadnego innego typu (spróbuj obj.add(1), zostanie zgłoszony błąd). Podobnie, obj1 jest typu Integer, nie można dodać do niego żadnego innego typu (spróbuj obj1.add("hello"), wystąpi błąd).