2012-03-21 19 views
7

Función:Java genéricos: Funcional-como max() abstracción

public abstract class Function<X, Y> {  
     abstract Y apply(X x);  
    } 

max implementación del método

public static <V extends Comparable<V>> Function<List<V>, V> max() { 

    return new Function<List<V>, V>() { 
     @Override 
     public V apply(List<V> list) { 
      return Collections.max(list); 
     } 
    }; 
} 

y el uso (la forma en que debe ser similar)

Date result = max().apply(datesList); 

Pero Obtenga este error y no entiendo por qué se requiere Object

incompatible types; inferred type argument(s) java.lang.Object do not conform to bounds of type variable(s) V 
found : <V>project.Function<java.util.List<V>,V> 
required: java.lang.Object 

He leído una gran cantidad de control de calidad similar pero no he encontrado cómo solucionarlo. Gracias.

+1

FYI , su tipo de 'Función' parece un buen lugar para usar una [interfaz] (http://docs.oracle.com/javase/tutorial/java/concepts/interface.html). – Taymon

+0

Estoy de acuerdo con Taymon, haría una interfaz en lugar de una clase abstracta. Tenga en cuenta que [Google Guava] (http://code.google.com/p/guava-libraries/) ya tiene una interfaz 'Function' que es exactamente la misma. – Jesper

+0

@Taymon Gracias por su sugerencia, pero en realidad tengo más métodos en esta clase. Por ejemplo: public Función then (Función second) {...} –

Respuesta

13

Java tiene una inferencia de tipo muy limitada. Si se escribe esto:

Date result = max().apply(datesList); 

no es lo suficientemente sofisticada como para inferir el parámetro de tipo del método max(), V, por lo que toma lugar java.lang.Object. Usted podría intentar esto:

Function<List<Date>, Date> fn = max(); 
Date result = fn.apply(dates); 

O, si desea escribir en una línea, se puede hacer lo siguiente, en el supuesto de que su método max() se define en una clase llamada Example:

Date result = Example.<Date>max().apply(dates); 
+0

¡Lo tengo, gracias! –

+0

Ahora entiendo que esto no fue mi culpa, sino limitaciones de inferencia de tipo Java. Gracias ! –