Para este ejemplo de la clase de Java:métodos Como llamar sobrecargado Java en Clojure
package foo;
public class TestInterop
{ public String test(int i)
{ return "Test(int)"; }
public String test(Object i)
{ return "Test(Object)"; }
}
Cuando comienzo Clojure y trato de llamar al método de prueba (int), el método de ensayo (objeto) se llama en su lugar, porque Clojure coloca automáticamente el entero en un objeto java.lang.Integer.
¿Cómo forzo a Clojure a llamar al método de prueba (int)?
user=> (.test (new foo.TestInterop) 10)
"Test(Object)"
Quiero llamar a métodos como Component.add(Component comp, int index)
en AWT, pero en lugar de seguir llamando add(Component comp, Object constraints)
, por lo que los botones de mi barra de herramientas siempre aparecen en el orden incorrecto.
Eso explica por qué siempre estuvo trabajando en los programas de prueba y no en el programa real. Puse la sugerencia de tipo sobre la llamada, y ahora está funcionando bien. Muchas gracias. Tuve la oportunidad de crear una macro para esto, ya que puede obtener la clase de la variable, pero parece que las sugerencias de tipo no macro-ise. –
¡Feliz de escuchar eso! Ah, y en realidad es posible manejar sugerencias de tipo en macros, y algunas veces una macro bien diseñada puede producir un código bien insinuado con un mecanografía mínima adicional. Puede publicar una pregunta por separado si desea ayuda con la redacción de una. –
No pude hacer que esto funcione con mi código, aunque mi situación es un poco diferente. Los métodos de Java que estoy tratando de llamar son los JavaFX 'Application.launch'. Deseo el método estático 'launch' con el argumento' Class extiende Application> 'y parece que no puede proporcionar una sugerencia de tipo para mi llamada (he intentado muchos enfoques) que hace que se llame al método correcto de 'lanzamiento' y obtengo los errores de 'La clase no se puede convertir en cadena'. – Jason