He estado usando una Collection
de los valores numéricos y han implementado algunas funcionalidades relacionadas (mapeo x-> valores de y, etc). Hasta ahora he hecho uso de los genéricos para permitir que cualquier subclase de Number
en el Collection
.
En esta clase en particular sigo corriendo en el problema de que no hay una manera fácil de fundido al genérico. Los métodos habituales, como Double.valueOf()
no pueden invocarse porque Number
no proporciona un método de este tipo.
¿Hay una buena manera de evitar esto?
He encontrado este post y el pensamiento que resolverlo, pero no puedo pasar el Class.class
parámetro a ella.
public class myList<T extends Number> extends Collection<T> {
@Override
public boolean add(T value){
// this is no problem
}
// What I want to do:
public boolean add(double value){
return this.add(T.valueOf(value));
}
// Using the example I found:
public void add(double value){
return this.add( (T) Ideone.parse(value, T.class) ); // no such option
}
}
Gracias por adelantado.
No hay camino para la myList
clase sea capaz de convertir double
a T
, ya que T
se desconoce.
Una manera de resolver esto es dejar que la persona que llama proporciona una función que convierte de double
a T
. He aquí un ejemplo:
public class myList<T extends Number> implements Collection<T> {
private DoubleFunction<T> fromDoubleFunction;
public myList(DoubleFunction<T> function) {
this.fromDoubleFunction = function;
}
public boolean add(double value) {
return this.add(this.fromDoubleFunction.apply(value));
}
//rest of code
}
Que luego se puede utilizar de esta manera:
myList<Integer> intList = new myList(d -> Double.valueOf(d).intValue());