2011-09-04 17 views
7

Obviamente, Java no tiene delegados o funciones como valores de primera clase y utiliza interfaces en su lugar, pero ¿cuál es la interfaz más cercana a los delegados Func <> o Action <> .NET? No es Runnable and Callable <>, pero solo en sabores que no toman parámetros.¿Qué es lo más parecido que Java tiene a los delegados .NET Func <> y Action <>?

Como Java no puede haber sobrecargado tipos con el mismo nombre y diferente número de argumentos de tipo genérico, entiendo que no puede haber un único nombre de interfaz compartida, pero podría ser un Runnable1 <>, Runnable2 <> y así sucesivamente.

¿Este estilo de programación no se usa en Java o me falta alguna interfaz existente?

+1

Antes de que MS creara C#, tenían una implementación de Java (lo llamaron J ++). Cuando intentaron agregar delegados (entre otras cosas, como enumeraciones), Sun los demandó y dijo que ya no podían enviar Java. Y es por eso que crearon C#. Si busca artículos sobre delegados de Java, encontrará muchas personas que critican la adición de delegados a Java y sugieren que las clases internas anónimas que implementan interfaces son mucho mejores. – Gabe

+0

Consulte también http://java.sun.com/docs/white/sidebar.html – Gabe

+1

"Java no puede tener tipos sobrecargados con el mismo nombre y una cantidad diferente de argumentos de tipo genérico": otra razón más por la cual la eliminación del tipo fue un enfoque incorrecto a los genéricos ... –

Respuesta

0

No estoy muy familiarizado con .Net, pero por lo que he visto hasta ahora parece que normalmente crearía una interfaz para cada tipo de función/acción que desea almacenar. Esto no es realmente lo mismo, pero suena como lo que estás buscando.

(la interfaz no es anónima, tiene un nombre, un significado y documentación, lo que puede hacer que el código sea más fácil de leer. Por otro lado, es una molestia adicional tener que escribirlo, y no se puede simplemente tirar cualquier función que coincida con la firma).

¿Tiene un caso de uso específico para el que busca una recomendación? Es difícil hacer declaraciones generalizadas;).

+1

'Action <>' está "sobrecargado" para manejar los parámetros de devolución y cero a N (actualmente 16), por lo tanto, 'Callable ' es inútil. De hecho, después de leer la descripción 'Callable ', supongo que 'Callable 'de Java solo se puede mapear en' Func ' de C#, (que toma cero parámetros y devuelve T) y nada más. – paercebal

+0

Gracias, por lo que las interfaces son a menudo probablemente, aunque técnicamente muy diferentes, en la práctica un sustituto razonable de la Acción . Actualizado la respuesta para reflejar eso. –

+0

Func <> y Action <> son muy útiles cuando se usan funciones de orden superior. Si quiero asignar todos los elementos de una lista a uno por uno, doy un Func <,> a Select() para hacerlo. Incluso podría ser en .NET un tipo de delegado con nombre, que sería la combinación más cercana a una interfaz especializada nombrada, pero la belleza de tenerlos anónimos radica en el hecho de que las funciones pueden usarse para cosas para las que no fueron específicamente creados. . – SoftMemes

Cuestiones relacionadas