Java泛型的Number.valueOf()实现
我一直在使用数值的Java泛型的Number.valueOf()实现,java,generics,casting,numbers,Java,Generics,Casting,Numbers,我一直在使用数值的集合,并实现了一些相关功能(映射x->y值等)。到目前为止,我已经使用泛型来允许集合中Number的任何子类 在这个特殊的类中,我一直遇到这样一个问题:没有简单的方法可以转换为泛型。无法调用像Double.valueOf()这样的常用方法,因为Number不提供这样的方法 有什么好办法吗 我发现并认为这可以解决它,但我无法将Class.Class参数传递给它 public class myList<T extends Number> extends Collecti
集合
,并实现了一些相关功能(映射x->y值等)。到目前为止,我已经使用泛型来允许集合中Number
的任何子类
在这个特殊的类中,我一直遇到这样一个问题:没有简单的方法可以转换为泛型。无法调用像Double.valueOf()
这样的常用方法,因为Number
不提供这样的方法
有什么好办法吗
我发现并认为这可以解决它,但我无法将Class.Class
参数传递给它
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
}
}
公共类myList扩展了集合{
@凌驾
公共布尔加法(T值){
//这没问题
}
//我想做的是:
公共布尔加法(双值){
返回此值。添加(T.valueOf(value));
}
//使用我发现的示例:
公共无效添加(双倍值){
返回this.add((T)Ideone.parse(value,T.class));//没有这样的选项
}
}
提前感谢。为类提供一个构造函数参数
public class myList<T extends Number> extends Collection<T> {
private final DoubleFunction<T> theDoubleFn;
public myList(DoubleFunction<T> theDoubleFn) {
this.theDoubleFn = theDoubleFn;
}
// ...
在方法中,myList
类无法将double
转换为T
,因为T
是未知的
解决这个问题的一种方法是让调用方提供一个从double
转换为T
的函数。下面是一个例子:
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
}
公共类myList实现集合{
私有双重功能来自双重功能;
公共myList(双功能){
this.fromDoubleFunction=函数;
}
公共布尔加法(双值){
返回this.add(this.fromDoubleFunction.apply(value));
}
//代码的其余部分
}
然后可以这样使用:
myList<Integer> intList = new myList(d -> Double.valueOf(d).intValue());
myList intList=newmylist(d->Double.valueOf(d.intValue());
Unrelated:如果您有一两分钟的时间,请看一下并告诉我您对该问题的两个答案的看法。
myList<Integer> intList = new myList(d -> Double.valueOf(d).intValue());