2012-03-21 13 views
7

Funzione:Java generici: funzionale simile max() astrazione

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

max metodo di implementazione

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); 
     } 
    }; 
} 

e l'uso (come dovrebbe essere simile)

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

Ma io ottenere questo errore e non capisco perché richiede 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 

Ho letto una grande quantità di QA simile ma non ho trovato come risolvere questo problema. Grazie.

+1

FYI , il tuo tipo 'Function' sembra un buon posto per usare una [interfaccia] (http://docs.oracle.com/javase/tutorial/java/concepts/interface.html). – Taymon

+0

Sono d'accordo con Taymon, vorrei creare un'interfaccia invece di una classe astratta. Nota che [Google Guava] (http://code.google.com/p/guava-libraries/) ha già un'interfaccia 'Function' che è esattamente la stessa. – Jesper

+0

@Taymon Grazie per il suggerimento, ma in realtà ho più metodi in questa classe. Ad esempio: pubblica Funzione quindi (Funzione secondo) {...} –

risposta

13

Java ha un'inferenza di tipo molto limitato. Se si scrive questo:

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

non è abbastanza sofisticato per dedurre il parametro type del metodo max(), V, quindi ci vuole java.lang.Object invece. Si potrebbe provare questo:

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

Oppure, se si vuole scrivere in una riga, si potrebbe fare quanto segue, partendo dal presupposto che il metodo max() è definito in una classe denominata Example:

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

Capito, grazie! –

+0

Ora capisco che non è stata colpa mia, ma limitazioni di inferenza di tipo Java. Grazie ! –