2011-08-24 36 views
7

Tôi đang viết một đoạn mã trong đó tôi phải đúc một đối tượng nếu nó là một thể hiện của một lớp nhất định.

Như thường lệ, tôi đang sử dụng instanceof để kiểm tra tính tương thích.

Vấn đề là kiểm tra không bao giờ hài lòng vì các đối tượng thuộc về các lớp "lạ".

Ví dụ; khi tôi gọi phương thức getClass().getSimpleName() trên đối tượng này, nó trả lại cho tôi tên của lớp + $* (ví dụ: ViewPart$1 thay vì ViewPart).

Điều này nghĩa là gì $*? Có giải pháp hay giải pháp khác không?

+1

là một lớp bên trong vô định? – Heisenbug

Trả lời

14

Điều đó hiển thị lớp bên trong (ẩn danh (nếu có số) hoặc được đặt tên). Ví dụ:

class Foo { 
    static class Bar { 
    } 
} 

Tên của lớp Foo.BarFoo$Bar. Bây giờ nếu chúng tôi có:

class Foo { 

    static void bar() { 
     Runnable r = new Runnable() { 
      public void run() {}; 
     }; 

     System.out.println(r.getClass()); 
    } 
} 

Điều đó sẽ in Foo$1.

Bạn có thể thấy cùng một hiệu ứng trong việc đặt tên tệp lớp do javac tạo.

4

Đây là các trường hợp của số anonymous class. ViewPart$1 là lớp ẩn danh đầu tiên được xác định bên trong ViewPart - nhưng điều đó không có nghĩa là đó là lớp con của ViewPart. Nó rất có thể là một triển khai anoymous của một số giao diện Listener.

+0

Có phải tài liệu đã được ghi nhận là lớp 'X $ 'trỏ đến lớp ẩn danh' X' không? –

+0

@Hablutzel: không, JLS chỉ cho biết tên phải có định dạng, $ theo sau là chữ số. Chuỗi các chữ số là một chi tiết thực hiện của trình biên dịch. –

1

$ biểu thị cho lớp bên trong. Ví dụ: xem xét hai lớp học

public class TopClass { 
    class SubClass { 
    // some methods 
    }// inner class end 
} // outer class end 

Nếu bạn biên dịch mã này, bạn sẽ nhận được hai tệp lớp TopClass.class và TopClass $ SubClass.class.

Kiểm tra lớp ViewPart của bạn cho dù lớp đó có bất kỳ lớp bên trong nào không. Hy vọng điều đó sẽ hữu ích.

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