जावा में <T> (कोण कोष्ठक) का क्या अर्थ है?


139

मैं वर्तमान में जावा का अध्ययन कर रहा हूं और हाल ही में कोण कोष्ठक (<>) द्वारा स्टंप किया गया है। वास्तव में उनका क्या मतलब है?

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

क्या <T>मतलब है? क्या इसका मतलब है कि मैं एक प्रकार की वस्तु बना सकता हूं T?


4
मुझे आपके कोड को पार्स करने में मुश्किल हो रही है। एक शुरुआत के लिए कोई इंडेंटेशन नहीं है, और दो खुले ब्रेसिज़ हैं और केवल एक करीब है। क्या T createObjectपूल या पूलफैक्ट्री के अंदर होना चाहिए? कहाँ this.freeObjects = ...माना जाता है क्या यह एक अलग उदाहरण है? इसे वहां रखना अवैध है; इसे एक विधि के अंदर होना चाहिए।
मागुका जूल

किसी के बारे में जानकारी के लिए देख रहा है, तो <>(हीरा ऑपरेटर), जो की तरह इस्तेमाल किया जा सकता List<Integer> list = new ArrayList<>();यात्रा docs.oracle.com/javase/7/docs/technotes/guides/language/...
Pshemo

जवाबों:


161

<T>एक सामान्य है और आमतौर पर "टाइप टी" के रूप में पढ़ा जा सकता है। यह <> बाईं ओर के प्रकार पर निर्भर करता है कि इसका वास्तव में क्या मतलब है।

मुझे नहीं पता कि क्या है Poolया क्या PoolFactoryहै, लेकिन आप भी उल्लेख करते हैं ArrayList<T>, जो एक मानक जावा वर्ग है, इसलिए मैं उससे बात करूंगा।

आमतौर पर, आपको वहां "T" दिखाई नहीं देगा, आप एक अन्य प्रकार देखेंगे। इसलिए यदि आप ArrayList<Integer>उदाहरण के लिए देखते हैं , तो इसका मतलब है कि "एन ArrayListका Integer।" कई वर्ग उदाहरण के लिए कंटेनर में तत्वों के प्रकार को बाधित करने के लिए जेनेरिक का उपयोग करते हैं। एक और उदाहरण है HashMap<String, Integer>, जिसका अर्थ है " Stringचाबियाँ और Integerमूल्यों के साथ एक नक्शा ।"

आपका पूल उदाहरण थोड़ा अलग है, क्योंकि वहां आप एक वर्ग को परिभाषित कर रहे हैं । तो उस स्थिति में, आप एक वर्ग बना रहे हैं कि कोई और व्यक्ति टी के स्थान पर किसी विशेष प्रकार के साथ त्वरित कर सकता है। उदाहरण के लिए, मैं Pool<String>आपकी कक्षा परिभाषा का उपयोग करके प्रकार का ऑब्जेक्ट बना सकता हूं । इसका मतलब होगा कि दो चीजें:

  • मेरे Pool<String>पास एक PoolFactory<String>ऐसा createObjectतरीका होगा जो Stringएस के साथ एक इंटरफ़ेस है ।
  • आंतरिक रूप से, स्ट्रिंग्स का Pool<String>एक होगा ArrayList

यह बहुत अच्छी खबर है, क्योंकि एक और समय पर, मैं साथ आ सकता हूं और एक Pool<Integer>ही कोड का उपयोग करूंगा, लेकिन स्रोत में Integerआप जहां भी देखेंगे T


3
सबसे अच्छी व्याख्याओं में से एक मैंने अब तक देखी है :) बहुत सराहना की!
सुहास चिक्कन्ना

34

यह वास्तव में सरल है। यह J2SE 5 में पेश किया गया एक नया फीचर है । वर्ग नाम के बाद कोणीय कोष्ठक निर्दिष्ट करने का मतलब है कि आप एक अस्थायी डेटा प्रकार बना रहे हैं जो किसी भी प्रकार के डेटा को पकड़ सकता है।

उदाहरण:

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

इसके बजाय <T>, आप वास्तव में कुछ भी लिख सकते हैं और यह उसी तरह काम करेगा। के <ABC>स्थान पर लिखने का प्रयास करें <T>

यह सिर्फ सुविधा के लिए है:

  • <T> किसी भी प्रकार के रूप में जाना जाता है
  • <E> तत्व प्रकार के रूप में
  • <N> संख्या प्रकार के रूप में
  • <V> मान के रूप में
  • <K> कुंजी के रूप में

लेकिन आप इसे अपनी इच्छानुसार कुछ भी नाम दे सकते हैं, यह वास्तव में मायने नहीं रखता।

इसके अलावा, Integer, String, Booleanआदि जावा जो संकलन के दौरान प्रकार के जाँच में मदद की आवरण वर्ग हैं। उदाहरण के लिए, उपरोक्त कोड में, objप्रकार का है String, इसलिए आप इसमें कोई अन्य प्रकार नहीं जोड़ सकते हैं (कोशिश करें obj.add(1), यह एक त्रुटि डालेगा)। इसी तरह, obj1की है Integerप्रकार, आप इसे (कोशिश करने के लिए किसी भी अन्य प्रकार नहीं जोड़ सकते obj1.add("hello"), त्रुटि हो जाएगा)।


23

यह जावा में जेनरिक से संबंधित है। अगर मैंने उल्लेख किया ArrayList<String>है कि मैं उस ArrayList में केवल स्ट्रिंग प्रकार ऑब्जेक्ट जोड़ सकता हूँ।

जावा में जेनरिक के दो प्रमुख लाभ हैं:

  1. आपके प्रोग्राम में कलाकारों की संख्या कम करना, इस प्रकार आपके प्रोग्राम में संभावित बगों की संख्या को कम करना।
  2. कोड स्पष्टता में सुधार

11

एक सामान्य प्रकार कहा जाता है। आप इस तरह से एक वस्तु पूल को तुरंत बदल सकते हैं:

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

सामान्य पैरामीटर केवल एक संदर्भ प्रकार हो सकता है। इसलिए आप आदिम प्रकारों का उपयोग नहीं कर सकते हैं जैसे इंट या डबल या चार या अन्य आदिम प्रकार।


9

<>जावा में जेनरिक को इंगित करने के लिए उपयोग किया जाता है ।

Tइस उदाहरण में एक प्रकार का पैरामीटर है। और कोई: instantiating कुछ चीजें है कि आप में से एक है नहीं कर सकते हैं के साथ क्या T

एंजेलिका लैंगर्स जेनरिक एफएक्यू से ऊपर जुड़े ट्यूटोरियल के अलावा विषय पर एक महान संसाधन है।


8

जेनेरिक कक्षाएं एक प्रकार की कक्षा होती हैं जो डेटा प्रकार में एक पैरामीटर के रूप में बनती हैं जब इसे बनाया जाता है। इस प्रकार के पैरामीटर को कोण कोष्ठक का उपयोग करके निर्दिष्ट किया जाता है और हर बार वर्ग के एक नए उदाहरण को तुरंत बदलकर प्रकार बदल सकता है। उदाहरण के लिए, आइए कर्मचारी वस्तुओं के लिए एक ArrayList बनाएं और कंपनी वस्तुओं के लिए दूसरा

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

आप देखेंगे कि हम दोनों सूचियों को बनाने के लिए एक ही ArrayList वर्ग का उपयोग कर रहे हैं और हम कोण ब्रैकेट का उपयोग करके कर्मचारी या कंपनी प्रकार में पास होते हैं। एक जेनेरिक क्लास होने से कई तरह के क्लास करने वाले कई तरह के डेटा कट को हैंडल करने में सक्षम हो जाते हैं। जेनरिक हर चीज को एक मजबूत प्रकार देकर बग्स को काटने में मदद करते हैं जो कंपाइलर को त्रुटियों को इंगित करने में मदद करता है। ArrayList के लिए एक प्रकार निर्दिष्ट करके, कंपाइलर एक त्रुटि फेंक देगा यदि आप कंपनी सूची में किसी कर्मचारी को जोड़ने का प्रयास करते हैं या इसके विपरीत।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.