2011-07-07 11 views
88

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

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

<T> का क्या अर्थ है? क्या इसका मतलब है कि मैं T प्रकार का ऑब्जेक्ट बना सकता हूं?

+8

google जावा जेनेरिक –

+4

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

+0

अगर कोई '<>' (हीरा ऑपरेटर) के बारे में जानकारी ढूंढ रहा है जिसका उपयोग 'सूची सूची = नई ArrayList <>() की तरह किया जा सकता है;' https://docs.oracle.com/javase/7/docs पर जाएं /technotes/guides/language/type-inference-generic-instance-creation.html। – Pshemo

उत्तर

4

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

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

Angelika Langers Generics FAQ से ऊपर दिए गए ट्यूटोरियल के अलावा विषय पर एक महान संसाधन है।

6

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

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

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

101

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

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

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

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

  • मेरे Pool<String> एक createObject विधि है कि रिटर्न String के साथ एक अंतरफलक PoolFactory<String> होगा: यही कारण है कि दो बातें मतलब होगा।
  • आंतरिक रूप से, Pool<String> में स्ट्रिंग्स का ArrayList होगा।

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

16

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

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

  1. अपने कार्यक्रम में डाले की संख्या कम है, इस प्रकार अपने कार्यक्रम में संभावित कीड़े की संख्या को कम।
1

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

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

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

10

यह वास्तव में सरल है। यह जे 2 एसई 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>, आप वास्तव में कुछ भी लिख सकते हैं और यह उसी तरह काम करेंगे। <T> के स्थान पर <ABC> लिखने का प्रयास करें।

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

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

लेकिन आप इसे जो कुछ भी चाहते हैं उसका नाम दे सकते हैं, इससे कोई फर्क नहीं पड़ता।

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

संबंधित मुद्दे