2013-04-24 37 views
7

Tôi đang cố gắng viết cấu trúc dữ liệu cho một bảng băm bằng cách sử dụng chuỗi. Khi tôi loại bỏ từ khóa "tĩnh" từ lớp lồng nhau, tôi nhận được lỗi "Không thể tạo một mảng chung của SeparateChaining.Node"? trên dòng mà tôi cấp phát bộ nhớ cho hmap bằng cách sử dụng mới.Đối với lớp ngoài chung, tại sao tôi cần khai báo lớp lồng nhau tĩnh?

Với từ khóa tĩnh hoạt động tốt.Bạn có thể chỉ ra ý nghĩa của từ khóa tĩnh ở đây và sự khác biệt của từ khóa đó không? Tôi đang tạo ra một mảng của đối tượng, sau đó làm thế nào đến nó cho thấy mảng chung trong lỗi (Eclipse)?

public class SeparateChaining<Key,Value> { 

    private int m; 

    private Node[] hmap; 

    private int n; 

    public SeparateChaining() 
    { 
     m=5; 
     n=0; 

     //error here on removal of static keyword from the node class declaration 
       hmap=new Node[m]; 

    } 

    private ____ class Node //works fine with static. Otherwise shows error 
    { 
     private Object key; 
     private Object value; 
     private Node next; 

     public Node(Object k, Object v) 
     { 

      key=k; 
      value=v; 
     } 

    } 

Cảm ơn

+0

Không phải loại 'khóa' là' Khóa' và loại 'giá trị' là' Giá trị' (không phải 'Đối tượng')? Và tương tự cho các tham số constructor? – Dukeling

Trả lời

6

Nếu bạn khai báo lớp bên trong Nodestatic thì lớp đó được liên kết với lớp bên ngoài SeparateChaining. Node sau đó thực tế là SeparateChaining.Node.

Nếu không có static, nó sẽ được liên kết với một phiên bản SeparateChaining, sẽ cần một tham số loại cặp, do đó lớp bên trong Node cũng sẽ cần các thông số loại đó. Node thì thực ra là SeparateChaining<Key, Value>.Node; và trong Java, creating an array of generics không hợp pháp.

+0

Thêm vào ở trên nó hoạt động nếu bạn cố gắng và xây dựng Node IndoKnight

+0

@Dukeling Điều đó sẽ thay đổi ý nghĩa của chương trình một chút, tôi có đúng không? –

+0

Trong trường hợp đó, tham số kiểu của Node sẽ không giống như tham số kiểu của 'ExternalChaining' bên ngoài; nó sẽ đổ bóng giá trị đó, thay vì sử dụng nó. –

0

Vâng, đó là chung chung. Nếu lớp bên trong không tĩnh thì kiểu là SeparateChaining<Key,Value>.Node. Khi bạn thêm tĩnh thì nó được xử lý như một lớp thông thường

-1

Keyowrd static trong khai báo lớp lồng nhau có nghĩa là "Tôi không muốn tham chiếu đến đối tượng của lớp bên ngoài, cảm ơn bạn rất nhiều". Nếu bạn không đặt static, thì bất kỳ đối tượng nào của lớp bên trong đều có tham chiếu đến một số đối tượng của lớp bên ngoài.

Và do đó một đối tượng của lớp bên trong, không tĩnh có thể được tạo bên trong một phương thức không tĩnh của một đối tượng của lớp bên ngoài.

Các vấn đề liên quan