Cannot instantiate the type Set
Solution 1
Set
is not a class, it is an interface.
So basically you can instantiate only class implementing Set
(HashSet
, LinkedHashSet
orTreeSet
)
For instance :
Set<String> mySet = new HashSet<String>();
Solution 2
Set is an interface. You cannot instantiate an interface, only classes which implement that interface.
The interface specifies behaviour, and that behaviour can be implemented in different ways by different types. If you think about it like that, it makes no sense to instantiate an interface because it's specifying what a thing must do, not how it does it.
John Tate
I am pretty awesome at C++ and PHP but I get stuck on some stupid shit.
Updated on September 23, 2020Comments
-
John Tate almost 4 years
I am trying to create a Set of Strings which is filled with the keys from a Hashtable so a for-each loop can iterate through the Set and put defaults in a Hashtable. I am still learning Java but the way I am trying to do it isn't valid syntax. Could someone please demonstrate the proper way of doing this and explain why my way doesn't work and theirs does.
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)); } } }
-
Agi Hammerthief over 5 years@JonSkeet "Except that you wouldn't actually want to use raw types ..." Why not? To my understanding, a
Set
is perfect for 1. preventing duplicate entries 2. Checking if an entry exists in a collection as it'scontains()
method is simpler/faster than that of aList
orMap
. -
Jon Skeet over 5 years@AgiHammerthief: That's not what raw types are. I suspect the original answer had
Set mySet = new HashSet();
. Those are raw types - no generic type arguments. I suspect the answer was then edited within 5 minutes, which means there's no record of that original version with raw types. -
Tamb over 3 yearsAn
interface
defines what should be inside this object. AHashSet
is an implementation of aSet
interface
so it contains the methods and properties that the Set interface defines.