2010-10-14 14 views
7

Vengo del mundo de C#.Java equivalente al tipo de clase dinámica C#?

en C# Soy capaz de utilizar la clase dinámica http://msdn.microsoft.com/en-us/library/dd264741.aspx

Esto me permite no tener que utilizar las clases con plantilla/genéricos, sino lograr una sensación simliar para situaciones certian.

No he tenido éxito en las búsquedas en Internet, ya que desafortunadamente las palabras clave "dinámicas" y "java" revelan una infinidad de información no relacionada en las arquitecturas dinámicas.

He incursionado un poco en javaFX y hay un tipo var que parece tener el mismo uso que la dinámica de C#. Sin embargo, no parece ser utilizable en Java.

gracias, Stephanie

+2

Tengo curiosidad por cómo se usa en C#. Parece que lo estás utilizando para escapar de la seguridad de tipo estático, lo cual no es una buena idea ni en C# ** ni ** Java. –

Respuesta

12

Java no es compatible con el tipado dinámico, pero puede simular algo así mediante el uso de proxy dinámico en Java. En primer lugar tendrá que declarar una interfaz con operaciones que desea invocar en sus objetos:

public interface MyOps { 
    void foo(); 
    void boo(); 
} 

A continuación, cree proxy para la invocación dinámica sobre myObjectInstance:

MyOps p = (MyOps) Proxy.newProxyInstance(getClass().getClassLoader(), // 
    new Class<?>[] { MyOps.class }, // 
    new MyHandler(myObject)); 
p.foo(); 
p.boo(); 

donde MyHandler se declara así:

public class MyHandler implements InvocationHandler { 
    private final Object o; 

    public MyHandler(Object o) { 
    this.o = o; 
    } 

    public Object invoke(Object proxy, Method m, Object[] args) throws Throwable { 
    Method method = o.getClass().getMethod(m.getName(), m.getParameterTypes()); 
    return method.invoke(o, args); 
    } 
} 

Por lo tanto, si myObject tiene los métodos foo() y boo(), se invocarán, o bien, obtendrá una RuntimeException.

También hay un número de idiomas que se pueden ejecutar en la compatibilidad con el tipado dinámico de JVM, p. Ej. Scala, Groovy, JRuby, BeanShell, JavaScript/Rhino y muchos otros. Hay algunos cambios de JVM en Java 7 para admitir un despacho dinámico nativo, por lo que estos lenguajes podrían funcionar mucho mejor, pero dicha característica no se expondrá directamente en el lenguaje Java de tipo estático.

3

No hay nada como eso en Java

3

No hay nada equivalente en Java. Lo más cercano que podrías hacer es declarar una variable de tipo Object pero luego debes convertir esa variable a lo que estás esperando para invocar cualquier método que no esté implementado por Object (o usar reflection pero eso es sloow).

Java es un lenguaje fuertemente tipado. Creo que para la próxima versión habrá algún tipo de tipado dinámico, para permitir cierres, pero eso es el próximo año o más probablemente 2012.

En Groovy puedes simplemente usar "def" para declarar una variable sin un tipo, y tipo se resolverá en tiempo de ejecución. Y puede compilar el código de Groovy en bytecode de Java ...

+2

¿Qué tienen que ver los cierres con el tipado dinámico? –

+0

Probablemente nada ... Supongo que depende de la implementación.Usando Groovy como referencia, puede declarar algo con "def myvar" y asignarle algo (incluido un cierre). Supongo que podría tener un tipo de cierre en Java, pero ¿no sería más flexible si tuviéramos también un tipo dinámico? – Chochos

+0

@ Chochos Sé que esto es 3 años tarde, pero para los cierres, lo que se implementó en C# no fue tipado dinámico, sino inferencia tipográfica. –

0

También puede incluir el código Scala, que no requiere declaraciones explícitas de tipo. Scala produce código de bytes Java. No he usado C#, así que me temo que no puedo llevar este comentario hasta el punto de responder directamente a la pregunta. Tal vez alguien más puede agregarle algo.