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