Java泛型:将字符串[]解析为(T扩展数字)[]

Java泛型:将字符串[]解析为(T扩展数字)[],java,generics,Java,Generics,我已经实现了这段代码,它工作得很好: static Integer[] parseInteger(String[] arr){ return Arrays.stream(arr).map(Integer::parseInt).toArray(Integer[]::new); } 但现在我在寻找这样的东西: public <T extends Number> T[] parseString(String[] arr,T n, Class<T> type){

我已经实现了这段代码,它工作得很好:

static Integer[] parseInteger(String[] arr){
     return Arrays.stream(arr).map(Integer::parseInt).toArray(Integer[]::new);
}
但现在我在寻找这样的东西:

public <T extends Number> T[] parseString(String[] arr,T n, Class<T> type){
    return Arrays.stream(arr).map(T::parseNumber).toArray(T[]::new);
}
public T[]parseString(String[]arr,tn,类类型){
返回Arrays.stream(arr).map(T::parseNumber).toArray(T[]::new);
}

这个问题有什么解决办法吗?找不到任何内容。

t::parseNumber
无法工作,因为在
Number
中没有
parseNumber
方法。此外,
静态
方法没有继承。另外,例如,
biginger
甚至不提供从
String
解析的
static
方法,
AtomicInteger
也不提供接受
String
的构造函数,因此,即使使用反射,也无法让它与API中的
Number
实现一起工作,更不用说所有可能的实现了

T[]:new
不起作用,因为无法使用类型参数生成数组

但是,您可以更改方法以使其正常工作:

传递一个
函数
来解析
字符串
s,或者传递一个
IntFunction
来生成数组,或者使用
数组
类():


T::parseNumber
不起作用,因为在
Number
中没有
parseNumber
方法。此外,
静态
方法没有继承。另外,例如,
biginger
甚至不提供从
String
解析的
static
方法,
AtomicInteger
也不提供接受
String
的构造函数,因此,即使使用反射,也无法让它与API中的
Number
实现一起工作,更不用说所有可能的实现了

T[]:new
不起作用,因为无法使用类型参数生成数组

但是,您可以更改方法以使其正常工作:

传递一个
函数
来解析
字符串
s,或者传递一个
IntFunction
来生成数组,或者使用
数组
类():


它无法工作,因为
Number
是一个抽象类,它不提供任何通用方法,允许将
字符串
解析到相应的
Number
实现中。您需要提供自己的方法,如下所示,例如:

public class NumberParser {
    public static <T extends Number> T parseNumber(String val, Class<T> type) {
        if (type == Double.class) {
            return (T) Double.valueOf(val);
        } else if (type == Float.class) {
            return (T) Float.valueOf(val);
        } else if (type == Integer.class) {
            return (T) Integer.valueOf(val);
        } else if (type == Long.class) {
            return (T) Long.valueOf(val);
        }
        throw new IllegalArgumentException("Unknown number type");
    }
}
输出:

1
2
3

它无法工作,因为
Number
是一个抽象类,它不提供任何通用方法,允许将
字符串
解析到相应的
Number
实现中。您需要提供自己的方法,如下所示,例如:

public class NumberParser {
    public static <T extends Number> T parseNumber(String val, Class<T> type) {
        if (type == Double.class) {
            return (T) Double.valueOf(val);
        } else if (type == Float.class) {
            return (T) Float.valueOf(val);
        } else if (type == Integer.class) {
            return (T) Integer.valueOf(val);
        } else if (type == Long.class) {
            return (T) Long.valueOf(val);
        }
        throw new IllegalArgumentException("Unknown number type");
    }
}
输出:

1
2
3
String[] values = {"1", "2", "3"};
Integer[] result = parseString(values, Integer.class);
for(Integer i : result) {
    System.out.println(i);
}
1
2
3