Подтвердить что ты не робот

Невозможно создать экземпляр типа Set

Я пытаюсь создать набор строк, который заполняется ключами из Hashtable, поэтому каждый цикл может выполнять итерацию по Set и помещать значения по умолчанию в Hashtable. Я все еще изучаю Java, но способ, которым я пытаюсь это сделать, не является допустимым синтаксисом. Может кто-то, пожалуйста, продемонстрировать надлежащий способ сделать это и объяснить, почему мой способ не работает, и что он делает.

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

Ответ 1

Set не является классом, это интерфейс.

Таким образом, в основном вы можете создавать экземпляры только класса Set (HashSet, LinkedHashSet или TreeSet)

Например:

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

Ответ 2

Set - это интерфейс. Вы не можете создать экземпляр интерфейса, только классы, которые реализуют этот интерфейс.

Интерфейс определяет поведение, и это поведение может быть реализовано различными способами различными типами. Если вы так думаете об этом, нет смысла создавать интерфейс, потому что он указывает, что нужно делать, а не как он это делает.

Ответ 3

Метод HashMap keySet() уже создает необходимый вам набор, поэтому просто:

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

Это представление ключей по умолчанию, поэтому его содержимое изменится, когда будут внесены изменения в базовую (defaults) карту. Изменения, внесенные в keys, также будут отображаться на карте, но вы можете удалить... не добавлять... ключи с карты.

Если вам нужна копия ключей, которые не взаимодействуют с исходной картой, используйте один из предложенных типов, например:

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