2013-09-22 53 views
18

Tôi đang cố gắng tạo Tập hợp các chuỗi được điền bằng các khóa từ một Hashtable để một vòng lặp cho mỗi có thể lặp qua Set và đặt các giá trị mặc định trong một Hashtable. Tôi vẫn đang học Java nhưng cách tôi đang cố gắng thực hiện nó không phải là cú pháp hợp lệ. Ai đó có thể xin vui lòng chứng minh cách thích hợp để làm điều này và giải thích lý do tại sao cách của tôi không hoạt động và của họ không.Không thể khởi tạo kiểu Set

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

nên được 'HashSet mới ();' –

+0

Hashtable chủ yếu là lỗi thời - bạn nên sử dụng HashMap thay thế. – assylias

+0

có thể trùng lặp của [Không thể khởi tạo Danh sách loại ] (http://stackoverflow.com/questions/7960149/cannot-instantiate-the-type-listproduct) – Raedwald

Trả lời

40

Set không phải là một lớp, nó là một giao diện.

Vì vậy, về cơ bản bạn có thể nhanh chóng chỉ lớp thực hiện Set (HashSet, LinkedHashSet hoặc TreeSet)

Ví dụ:

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

Ngoại trừ điều đó bạn sẽ không thực sự muốn sử dụng các loại thô ... –

+1

Ah, những gì một sai lầm tân binh tôi đã thực hiện. –

1

Set là một giao diện. Bạn không thể khởi tạo một giao diện, chỉ các lớp thực hiện giao diện đó.

Giao diện chỉ định hành vi và hành vi đó có thể được triển khai theo nhiều cách khác nhau theo các loại khác nhau. Nếu bạn nghĩ về nó như thế, nó không có ý nghĩa gì để tạo ra một giao diện bởi vì nó chỉ định một thứ phải làm, không phải nó làm như thế nào.

0

phương pháp HashMap của keySet() đã tạo ra các thiết lập bạn cần, vì vậy chỉ đơn giản là:

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

Đây là một xem trong những chìa khóa ở giá trị mặc định, vì vậy nội dung của nó sẽ thay đổi khi thay đổi được thực hiện cho các cơ bản (defaults) bản đồ. Các thay đổi được thực hiện cho keys cũng sẽ được phản ánh trên bản đồ, nhưng bạn chỉ có thể xóa ... không thêm ... các phím từ bản đồ.

Nếu bạn cần một bản sao của các phím điều đó không có tương tác với bản đồ gốc, sau đó sử dụng một trong những loại đề nghị, như trong:

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