Cannot instantiate the type Set

72,638

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.

Share:
72,638
John Tate
Author by

John Tate

I am pretty awesome at C++ and PHP but I get stuck on some stupid shit.

Updated on September 23, 2020

Comments

  • John Tate
    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
    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's contains() method is simpler/faster than that of a List or Map.
  • Jon Skeet
    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
    Tamb over 3 years
    An interface defines what should be inside this object. A HashSet is an implementation of a Set interface so it contains the methods and properties that the Set interface defines.