2013-09-22 11 views
18

टाइप को तुरंत चालू नहीं कर सकता है, मैं स्ट्रिंग्स का एक सेट बनाने की कोशिश कर रहा हूं जो हैशटेबल से चाबियों से भरा हुआ है, इसलिए प्रत्येक लूप सेट के माध्यम से पुन: सक्रिय हो सकता है और हैशटेबल में डिफ़ॉल्ट डाल सकता है। मैं अभी भी जावा सीख रहा हूं लेकिन जिस तरह से मैं इसे करने की कोशिश कर रहा हूं वह वैध वाक्यविन्यास नहीं है। क्या कोई ऐसा करने का उचित तरीका दिखा सकता है और समझा सकता है कि मेरा तरीका क्यों काम नहीं करता है और उनका क्या करता है।टाइप

private Hashtable<String, String> defaultConfig() { 
    Hashtable<String, String> tbl = new Hashtable<String, String>(); 
    tbl.put("nginx-servers","/etc/nginx/servers"); 
    tbl.put("fpm-servers","/etc/fpm/"); 
    tbl.put("fpm-portavail","9001"); 
    tbl.put("webalizer-script","/usr/local/bin/webalizer.sh"); 
    tbl.put("sys-useradd","/sbin/useradd"); 
    tbl.put("sys-nginx","/usr/sbin/nginx"); 
    tbl.put("sys-fpmrc","/etc/rc.d/php_fpm"); 
    tbl.put("www-sites","/var/www/sites/"); 
    tbl.put("www-group","www"); 
    return tbl; 
} 

//This sets missing configuration options to their defaults. 
private void fixMissing(Hashtable<String, String> tbl) { 
    Hashtable<String, String> defaults = new Hashtable<String, String>(defaultConfig()); 
    //The part in error is below... 
    Set<String> keys = new Set<String>(defaults.keySet()); 

    for (String k : keys) { 
     if (!tbl.containsKey(k)) { 
      tbl.put(k, defaults.get(k)); 
     } 
    } 
} 
+0

'होना चाहिए नई HashSet ();' –

+0

हैशटेबल ज्यादातर अप्रचलित है - आपको आमतौर पर इसके बजाय हैश मैप का उपयोग करना चाहिए। – assylias

+0

संभावित डुप्लिकेट [प्रकार सूची को तत्काल नहीं कर सकता ] (http://stackoverflow.com/questions/7960149/cannot-instantiate-the-type-listproduct) – Raedwald

उत्तर

40

Set कक्षा नहीं है, यह एक इंटरफ़ेस है।

Set<String> mySet = new HashSet<String>(); 
+0

इसके अलावा आप वास्तव में कच्चे प्रकार का उपयोग नहीं करना चाहते हैं ... –

+1

आह, मैंने कितनी गड़बड़ी की गलती की है। –

1

सेट एक अंतरफलक है:

तो बुनियादी तौर पर आप केवल वर्ग Set (HashSet, LinkedHashSet या TreeSet)

को लागू करने उदाहरण के लिए दृष्टांत कर सकते हैं। आप एक इंटरफ़ेस को तुरंत चालू नहीं कर सकते हैं, केवल उस इंटरफ़ेस को लागू करने वाले वर्ग।

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

0

HashMap के keySet() पद्धति पहले से ही, सेट की जरूरत है बनाता है तो बस:

Set<String> keys = defaults.keySet(); 

यह एक दृश्य चूक में चाबियों का है, इसलिए इसकी सामग्री अंतर्निहित के लिए बदल जाएगा परिवर्तन कर दिए जाने (defaults) नक्शा। keys पर किए गए परिवर्तन नक्शे में भी दिखाई देंगे, लेकिन आप केवल हटा सकते हैं ... मानचित्र से कुंजी नहीं जोड़ सकते हैं।

आप कुंजी है कि मूल नक्शे के साथ बातचीत नहीं करता की एक प्रति की जरूरत है, तो प्रकार का उपयोग का सुझाव दिया, के रूप में:

Set<String> keys = new HashSet(defaults.keySet()); 
संबंधित मुद्दे