Java'da <T> (açılı ayraçlar) ne anlama geliyor?


139

Şu anda Java eğitimi alıyorum ve yakın zamanda açılı ayraçlar (<>) tarafından yoruldum. Tam olarak ne anlama geliyorlar?

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

Ne anlama <T>geliyor? Bu tür bir nesne oluşturabileceğim anlamına mı geliyor T?


4
Kodunuzu ayrıştırmakta zorlanıyorum. Bir başlangıç ​​için girinti yoktur ve iki açık diş teli ve sadece bir yakın vardır. Is T createObjectHavuz veya PoolFactory içeride olması gerekiyordu? Nerede this.freeObjects = ...olmalı? Bu ayrı bir örnek mi? Orada olması yasadışı; bir yöntemin içinde olmalıdır.
mgiuca

Birisi <>(elmas operatörü) hakkında bilgi edinmek için docs.oracle.com/javase/7/docs/technotes/guides/language/…List<Integer> list = new ArrayList<>(); adresini ziyaret edebilir .
Pshemo

Yanıtlar:


161

<T>Bir olan jenerik ve genellikle "tipi T" olarak okunabilir. Bu aslında ne anlama geldiğinin <> solundaki türe bağlıdır.

A Poolya da ne olduğunu bilmiyorum PoolFactory, ama aynı zamanda ArrayList<T>standart bir Java sınıfı olduğunu da söylüyorsunuz, bu yüzden bununla konuşacağım.

Genellikle, orada "T" görmezsiniz, başka bir tür görürsünüz. Yani ArrayList<Integer>, örneğin, "An ArrayListof Integers " anlamına gelir . Birçok sınıf, örneğin bir kaptaki öğelerin türünü sınırlamak için jenerikler kullanır. Başka bir örnek, HashMap<String, Integer>" Stringanahtar ve Integerdeğer içeren bir harita" anlamına gelir .

Pool örneğiniz biraz farklıdır, çünkü orada bir sınıf tanımlarsınız . Bu durumda, başka birinin T yerine belirli bir türle başlatabileceği bir sınıf oluşturuyorsunuz. Örneğin, Pool<String>sınıf tanımınızı kullanarak bir tür nesne oluşturabilirim . Bu iki anlama gelir:

  • Benim s döndüren bir yöntem ile Pool<String>bir arabirim olurdu .PoolFactory<String>createObjectString
  • Dahili olarak, Pool<String>bir ArrayListDizeleri içerir.

Bu harika bir haber, çünkü başka bir zamanda, gelip Pool<Integer>aynı kodu kullanacak bir tane oluşturabilirim, ancak kaynakta Integergördüğünüz her yere sahip olabilirim T.


3
Şimdiye kadar gördüğüm en iyi açıklamalardan biri :) Çok takdir !.
Suhas Chikkanna

34

Gerçekten çok basit. J2SE 5'te tanıtılan yeni bir özellik . Sınıf adından sonra köşeli parantez belirtmek, her türlü veriyi tutabilecek geçici bir veri türü oluşturduğunuz anlamına gelir.

Misal:

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

Bunun yerine, <T>aslında herhangi bir şey yazabilirsiniz ve aynı şekilde çalışır. <ABC>Yerine yazmayı deneyin <T>.

Bu sadece kolaylık sağlamak içindir:

  • <T> herhangi bir tür olarak ifade edilir
  • <E> eleman türü olarak
  • <N> sayı türü olarak
  • <V> değer olarak
  • <K> anahtar olarak

Ama istediğiniz herhangi bir şeyi adlandırabilirsiniz, gerçekten önemli değil.

Üstelik Integer, String, Booleanvb hangi yardım derleme sırasında türleri denetlenirken Java sarıcı sınıflardır. Örneğin, yukarıdaki kodda objtür vardır String, bu yüzden başka bir tür ekleyemezsiniz (deneyin obj.add(1), bir hata verecektir). Benzer şekilde, obj1taşımaktadır Integertürü, bunu (denemek için başka türde ekleyemezsiniz obj1.add("hello"), hata olacaktır).


23

Java'daki jeneriklerle ilgilidir. BahsetmişsemArrayList<String> bu ifade Ben ArrayList sadece String türü nesne ekleyebilirsiniz anlamına gelir.

Java'daki jeneriklerin iki önemli faydası:

  1. Programınızdaki yayın sayısını azaltmak, böylece programınızdaki potansiyel hata sayısını azaltmak.
  2. Kod netliğini artırma

11

genel tip olarak adlandırılır. Aşağıdaki gibi bir nesne Havuzunu başlatabilirsiniz:

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

Genel parametre yalnızca bir referans türü olabilir. Bu nedenle int veya double veya char gibi ilkel türleri veya diğer ilkel türleri kullanamazsınız.


9

<>Java'daki jenerikleri belirtmek için kullanılır .

Tbu örnekte bir tür parametresidir. Ve hiç: başlatmasını o birkaç şeyden biridir olamaz ile yapmakT .

Yukarıda bağlantılı öğreticinin yanı sıra Angelika Langers Generics SSS bu konuda harika bir kaynaktır.


8

Genel sınıflar, veri türünü oluşturulduğunda parametre olarak alan bir sınıf türüdür. Bu tür parametresi açılı ayraçlar kullanılarak belirtilir ve sınıfın yeni bir örneği her başlatıldığında tür değişebilir. Örneğin, Çalışan nesneleri için bir ArrayList ve Şirket nesneleri için başka bir ArrayList oluşturalım

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

Her iki listeyi oluşturmak için aynı ArrayList sınıfını kullandığımızı ve Çalışan veya Şirket türünü açılı ayraçlar kullanarak geçirdiğimizi göreceksiniz. Bir genel sınıfa sahip olmak, benzer görevleri yerine getiren birçok sınıfa sahip olmak için birden çok veri türünü işleyebilir. Generics ayrıca, derleyicinin hataları işaret etmesine yardımcı olan güçlü bir tür vererek hataları azaltmaya yardımcı olur. ArrayList için bir tür belirleyerek, Şirket listesine bir Çalışan eklemeye çalışırsanız derleyici bir hata atar veya bunun tersi de geçerlidir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.