2014-10-16 19 views
10

Tôi gặp sự cố sau. Hai loại ẩn danh lồng nhau. Tôi muốn truy cập tham chiếu "này" của lớp ẩn danh bên ngoài bên trong lớp bên trong nhất. Thông thường nếu có một lớp lồng nhau ẩn danh trong một lớp bên ngoài được đặt tên (cho phép gọi nó là "lớp bên ngoài") anh/cô ấy sẽ gõ bên trong lớp lồng nhau Outer.this.someMethod(). Làm cách nào để tôi tham khảo lớp bên ngoài nếu nó ẩn danh? Ví dụ Code:Cách truy cập tham chiếu "này" của lớp bên ngoài ẩn danh trong java

public interface Outer { 
    void outerMethod(); 
} 

public interface Inner { 
    void innerMethod(); 
} 
... 
public static void main(String[] args) { 
... 
new Outer() { 
    public void outerMethod() { 
     new Inner() { 
      public void innerMethod() { 
       Outer.this.hashCode(); // this does not work 
      } // innerMethod 
     }; // Inner 
    } // outerMethod 
}; // Outer 
... 
} // main 

Các lỗi tôi nhận được là

Không dụ kèm theo của các loại Outer có thể truy cập trong phạm vi

Tôi biết rằng tôi có thể sao chép các tài liệu tham khảo như sau:

final Outer outerThisCopy = this; 

ngay trước khi khởi tạo Inner đối tượng và sau đó tham khảo biến này. Mục tiêu thực sự là tôi muốn so sánh hashCodes của outerThisCopy và đối tượng được truy cập bên trong đối tượng new Inner (ví dụ: Outer.this) cho mục đích gỡ lỗi. Tôi có một số đối số tốt để nghĩ rằng hai đối tượng này là khác nhau (trong trường hợp của tôi). [Bối cảnh: Đối số là việc gọi trình thu thập được thực hiện trong lớp "Bên ngoài" không bị che khuất trong lớp "Bên trong" trả về các đối tượng khác nhau]

Bất kỳ ý tưởng nào làm cách nào để truy cập vào tham chiếu "này" của bao vây loại ẩn danh?

Cảm ơn bạn.

+1

Bạn có thể cung cấp phương thức 'int outerHashCode() {return hashCode(); } 'trong lớp bên ngoài ẩn danh của bạn. Trong lớp bên trong của bạn, bạn có quyền truy cập vào phương thức này; chỉ cần gọi nó. Tôi sợ, một cách tiếp cận khác là không thể. – Seelenvirtuose

Trả lời

14

Bạn không thể truy cập cá thể lớp ẩn danh trực tiếp từ lớp bên trong hoặc lớp ẩn danh khác bên trong lớp, vì lớp ẩn danh không có tên. Tuy nhiên, bạn có thể lấy tham chiếu đến lớp bên ngoài thông qua một phương thức:

new Outer() 
{ 
    public Outer getOuter() 
    { 
     return this; 
    } 

    public void outerMethod() 
    { 
     new Inner() 
     { 
      public void innerMethod() 
      { 
       getOuter().hashCode(); 
      } 
     }; 
    } 
}; 
+1

Cảm ơn rất nhiều. Điều này làm việc tốt. – egelev

+0

Tuyệt vời. Nhưng nó hoạt động như thế nào? –

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