2012-05-22 16 views
5

me gustaría tener clase funtor como esto:clase genérica funtor en Java

public class Functor<T, R> { 
    public R invoke(T a) { ... } 
} 

Y otra clase para los 2 argumentos:

public class Functor<T1, T2, R> { 
    public R invoke(T1 a, T2 b) { ... } 
} 

Y así sucesivamente.

En C# Puedo escribir:

class Functor<T> { ... } 
class Functor<T1, T2> { ... } 

Pero en Java sería un error:

The type Functor is already defined 

¿Cuáles son las mejores prácticas para múltiples argumentos clases genéricas en Java?

+0

No es una respuesta a su pregunta, pero ¿conoce bibliotecas como http://functionaljava.org/ que le proporcionarán un conjunto de funtores listos para usar más una rica biblioteca construida a su alrededor? – henry

Respuesta

5

Debido a que los genéricos son implementados en Java por el borrado de la información de tipo (en class C<T>, T desaparece en el archivo .class compilados) no hay manera para que el compilador sabe qué clase que está hablando en tiempo de ejecución.

Si define F<T1> y F<T1,T2> y las carga ambas, algunas clase C, no pudo identificar la que quería usar.

Este es el camino más largo para decir, no creo que puedas hacer eso en Java. : \

Lo que es posible que desee hacer es simplemente tienen un solo argumento funtor F<T> y dejar T ser objeto, un objeto Pair<T1, T2>, un ThreeTuple<T1, T2, T3> etc. Scala hace esto.

+1

gracias! y qué mejor práctica para las clases genéricas multi-argumentos en java? – user1312837

+0

Acabo de editar la respuesta para incluirla. En resumen, en F T se convierte en un tipo de argumento que contiene 1 o 2 o 3 ... N tipos para sus entradas. Por ejemplo, F >. – Sam

+0

@sam - Consejo de formato: puede utilizar los trazos atrás (\ ') para adjuntar el formato de código en línea para que no tenga que preocuparse por usar < etc. Eso funciona tanto en publicaciones como en comentarios. Ah, y 1 –

0

¿Por qué lo llamas functor? Si revisas la definición de functor en wikipedia, verás que este es un término equivocado.

En Scala esto se llama Función; y debido a los detalles de jvm y bytecode, hay muchas versiones, dependiendo de arity: Function0<Res>, Function1<T1, Res>, Function2<T1,T2, Res>, etc., hasta Function22.

+1

No responde la pregunta - debería ser un comentario. –