Apa arti <T> (tanda kurung sudut) di Java?

140

Saya sedang mempelajari Java dan baru-baru ini bingung dengan tanda kurung siku (<>). Apa sebenarnya yang mereka maksud?

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

Apa <T>maksudnya Apakah ini berarti saya dapat membuat objek bertipe T?

Tertawa
sumber
4
Saya merasa sulit untuk mengurai kode Anda. Tidak ada lekukan untuk memulai, dan ada dua kawat gigi terbuka dan hanya satu penutup. Apakah T createObjectseharusnya berada di dalam Pool atau PoolFactory? Dimana this.freeObjects = ...seharusnya? Apakah itu contoh terpisah? Dilarang menyimpannya di sana; itu harus di dalam metode.
mgiuca
Jika seseorang mencari informasi tentang <>(diamond operator) yang bisa digunakan seperti List<Integer> list = new ArrayList<>();kunjungi docs.oracle.com/javase/7/docs/technotes/guides/language/… .
Pshemo

Jawaban:

163

<T>adalah generik dan biasanya dapat dibaca sebagai "tipe T". Itu tergantung pada jenis di sebelah kiri <> apa artinya sebenarnya.

Saya tidak tahu apa itu Poolatau PoolFactory, tetapi Anda juga menyebutkan ArrayList<T>, yang merupakan kelas Java standar, jadi saya akan membahasnya.

Biasanya, Anda tidak akan melihat "T" di sana, Anda akan melihat jenis lain. Jadi jika Anda melihat ArrayList<Integer>misalnya, itu berarti "An ArrayListof Integers." Banyak kelas menggunakan generik untuk membatasi jenis elemen dalam wadah, misalnya. Contoh lainnya adalah HashMap<String, Integer>, yang berarti "peta dengan Stringkunci dan Integernilai".

Contoh Pool Anda sedikit berbeda, karena di sana Anda mendefinisikan kelas. Jadi dalam kasus ini, Anda membuat kelas yang bisa dibuat orang lain dengan tipe tertentu di tempat T. Misalnya, saya bisa membuat objek bertipe Pool<String>menggunakan definisi kelas Anda. Itu berarti dua hal:

  • Saya Pool<String>akan memiliki antarmuka PoolFactory<String>dengan createObjectmetode yang mengembalikan Strings.
  • Secara internal, Pool<String>akan berisi ArrayListString.

Ini adalah berita bagus, karena di lain waktu, saya bisa datang dan membuat Pool<Integer>yang akan menggunakan kode yang sama, tetapi ada di Integermana pun yang Anda lihat Tdi sumbernya.

mgiuca
sumber
3
Salah satu penjelasan terbaik yang pernah saya lihat sejauh ini :) Sangat dihargai !.
Suhas Chikkanna
37

Sangat sederhana. Ini adalah fitur baru yang diperkenalkan di J2SE 5 . Menentukan tanda kurung siku setelah nama kelas berarti Anda membuat tipe data sementara yang dapat menampung semua jenis data.

Contoh:

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);
    }
}

Alih-alih <T>, Anda benar-benar dapat menulis apa saja dan itu akan bekerja dengan cara yang sama. Cobalah menulis <ABC>di tempat <T>.

Ini hanya untuk kenyamanan:

  • <T> disebut sebagai tipe apapun
  • <E> sebagai tipe elemen
  • <N> sebagai tipe nomor
  • <V> sebagai nilai
  • <K> sebagai kunci

Tetapi Anda dapat menamainya apa pun yang Anda inginkan, itu tidak terlalu penting.

Selain itu, Integer, String, Booleandll adalah kelas wrapper Jawa yang membantu dalam memeriksa jenis selama kompilasi. Misalnya, dalam kode di atas, objadalah tipe String, jadi Anda tidak dapat menambahkan tipe lain ke dalamnya (coba obj.add(1), itu akan memunculkan kesalahan). Demikian pula, obj1adalah dari Integertipenya, Anda tidak dapat menambahkan tipe lain ke dalamnya (coba obj1.add("hello"), kesalahan akan ada).

Ruturaj Mohanty
sumber
24

Ini terkait dengan obat generik di java. Jika saya menyebutkan ArrayList<String>itu berarti saya hanya dapat menambahkan objek tipe String ke ArrayList itu.

Dua manfaat utama obat generik di Java adalah:

  1. Mengurangi jumlah cast dalam program Anda, sehingga mengurangi jumlah bug potensial dalam program Anda.
  2. Meningkatkan kejelasan kode
Paul Bellora
sumber
11

disebut tipe generik. Anda dapat membuat instance Pool objek seperti ini:

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

Parameter generik hanya dapat berupa tipe referensi. Jadi Anda tidak bisa menggunakan tipe primitif seperti int atau double atau char atau tipe primitif lainnya.

Rafiek
sumber
9

<>digunakan untuk menunjukkan obat generik di Java.

Tadalah parameter tipe dalam contoh ini. Dan tidak: membuat contoh adalah salah satu dari sedikit hal yang tidak dapat Anda lakukan T.

Terlepas dari tutorial yang ditautkan di atas, FAQ Generik Angelika Langers adalah sumber daya yang bagus tentang topik ini.

Joachim Sauer
sumber
8

Kelas generik adalah jenis kelas yang menggunakan tipe data sebagai parameter saat dibuat. Parameter tipe ini ditentukan menggunakan tanda kurung sudut dan tipe dapat berubah setiap kali instance baru dari kelas dibuat. Misalnya, mari buat ArrayList untuk objek Karyawan dan satu lagi untuk objek Perusahaan

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

Anda akan melihat bahwa kami menggunakan kelas ArrayList yang sama untuk membuat kedua daftar dan kami meneruskan tipe Karyawan atau Perusahaan menggunakan tanda kurung sudut. Memiliki satu kelas generik yang dapat menangani beberapa jenis data mengurangi memiliki banyak kelas yang melakukan tugas serupa. Generik juga membantu mengurangi bug dengan memberikan semua tipe yang kuat yang membantu kompiler menunjukkan kesalahan. Dengan menentukan tipe untuk ArrayList, kompilator akan menampilkan kesalahan jika Anda mencoba menambahkan Karyawan ke daftar Perusahaan atau sebaliknya.

Adiii
sumber