2011-08-24 8 views
7

Estoy escribiendo un fragmento de código en el que tengo que lanzar un objeto si es una instancia de cierta clase.

Como de costumbre, estoy usando instanceof para verificar la compatibilidad.

El problema es que el cheque nunca se cumple porque los objetos pertenecen a clases "extrañas".

Por ejemplo; cuando llamo al método getClass().getSimpleName() en este objeto, me devuelve el nombre de la clase + $* (por ejemplo, ViewPart$1 en lugar de ViewPart).

¿Qué significa esto $*? ¿Existe una solución o una solución?

+1

es una clase interna anonima? – Heisenbug

Respuesta

14

Eso muestra una clase interna (anónima (si tiene un número) o nombrada). Por ejemplo:

class Foo { 
    static class Bar { 
    } 
} 

El nombre de la clase Foo.Bar es Foo$Bar. Ahora si tuviéramos:

class Foo { 

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

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

Eso imprimirá Foo$1.

Puede ver el mismo efecto en la denominación de los archivos de clase creados por javac.

4

Estas son instancias de anonymous class. ViewPart$1 es la primera clase anónima definida dentro de ViewPart, pero eso no significa que sea una subclase de ViewPart. Es muy probable que sea una implementación anómala de alguna interfaz de escucha.

+0

¿Está documentado el hecho de que la 'Clase $ X' apunta a la' X'th clase anónima? –

+0

@Hablutzel: no, el JLS solo dice que el nombre debe tener el formato, $ seguido de dígitos. La secuencia de dígitos es un detalle de implementación del compilador. –

1

$ denota para la clase interna. Por ejemplo, consideremos dos clases

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

Si se compila el código obtendrá dos archivos de clase y TopClass.class TopClass $ SubClass.class.

Compruebe su clase ViewPart si tiene alguna clase interna. Espero que ayude.

Cuestiones relacionadas