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
?
T createObject
seharusnya berada di dalam Pool atau PoolFactory? Dimanathis.freeObjects = ...
seharusnya? Apakah itu contoh terpisah? Dilarang menyimpannya di sana; itu harus di dalam metode.<>
(diamond operator) yang bisa digunakan sepertiList<Integer> list = new ArrayList<>();
kunjungi docs.oracle.com/javase/7/docs/technotes/guides/language/… .Jawaban:
<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
Pool
atauPoolFactory
, tetapi Anda juga menyebutkanArrayList<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 "AnArrayList
ofInteger
s." Banyak kelas menggunakan generik untuk membatasi jenis elemen dalam wadah, misalnya. Contoh lainnya adalahHashMap<String, Integer>
, yang berarti "peta denganString
kunci danInteger
nilai".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:Pool<String>
akan memiliki antarmukaPoolFactory<String>
dengancreateObject
metode yang mengembalikanString
s.Pool<String>
akan berisiArrayList
String.Ini adalah berita bagus, karena di lain waktu, saya bisa datang dan membuat
Pool<Integer>
yang akan menggunakan kode yang sama, tetapi ada diInteger
mana pun yang Anda lihatT
di sumbernya.sumber
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 kunciTetapi Anda dapat menamainya apa pun yang Anda inginkan, itu tidak terlalu penting.
Selain itu,
Integer
,String
,Boolean
dll adalah kelas wrapper Jawa yang membantu dalam memeriksa jenis selama kompilasi. Misalnya, dalam kode di atas,obj
adalah tipeString
, jadi Anda tidak dapat menambahkan tipe lain ke dalamnya (cobaobj.add(1)
, itu akan memunculkan kesalahan). Demikian pula,obj1
adalah dariInteger
tipenya, Anda tidak dapat menambahkan tipe lain ke dalamnya (cobaobj1.add("hello")
, kesalahan akan ada).sumber
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:
sumber
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.
sumber
<>
digunakan untuk menunjukkan obat generik di Java.T
adalah parameter tipe dalam contoh ini. Dan tidak: membuat contoh adalah salah satu dari sedikit hal yang tidak dapat Anda lakukanT
.Terlepas dari tutorial yang ditautkan di atas, FAQ Generik Angelika Langers adalah sumber daya yang bagus tentang topik ini.
sumber
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.
sumber