L'esempio che presenti nel tuo la domanda non ha nulla a che fare con Java 8 e tutto ciò che riguarda il modo in cui i generici funzionano in Java. Function<T, Integer> function
e Function<T, Double> function
passeranno attraverso type-erasure quando compilati e verranno trasformati in Function
. La regola generale per l'overloading del metodo è di avere numero, tipo o sequenza di parametri diversi. Poiché entrambi i metodi si trasformeranno per prendere un argomento Function
, il compilatore si lamenta di ciò.
Detto questo, srborlongan ha già fornito un modo per risolvere il problema. Il problema con questa soluzione è che devi continuare a modificare la tua classe Test
per ogni tipo di operazione (addizione, sottrazione, ecc.) Su diversi tipi (intero, doppio, ecc.). Una soluzione alternativa sarebbe quella di utilizzare method overriding
invece di method overloading
:
cambiare la classe Test
un po 'come segue:
public abstract class Test<I,O extends Number> {
List<I> list = new ArrayList<>();
public O performOperation(Function<I,O> function) {
return list.stream().map(function).reduce((a,b)->operation(a,b)).get();
}
public void add(I i) {
list.add(i);
}
public abstract O operation(O a,O b);
}
creare una sottoclasse di Test
che aggiungerà due Integer
s.
public class MapStringToIntAddtionOperation extends Test<String,Integer> {
@Override
public Integer operation(Integer a,Integer b) {
return a+b;
}
}
codice client può quindi utilizzare il codice precedente come segue:
public static void main(String []args) {
Test<String,Integer> test = new MapStringToIntAddtionOperation();
test.add("1");
test.add("2");
System.out.println(test.performOperation(Integer::parseInt));
}
Il vantaggio dell'utilizzo di questo approccio è che la classe Test
è in linea con il principio open-closed
. Per aggiungere una nuova operazione come la moltiplicazione, tutto ciò che devi fare è aggiungere una nuova sottoclasse di Test
e override
al metodo operation
per moltiplicare due numeri. Club con lo schema Decorator e puoi anche ridurre al minimo il numero di sottoclassi che devi creare.
Nota L'esempio in questa risposta è indicativo. Ci sono molte aree di miglioramento (come rendere l'interfaccia funzionale Test
invece di una classe astratta) che vanno oltre lo scopo della domanda.
Uguali a Java 7, 6 e 5: non è possibile . Questo è quello che ti dice il messaggio. –