Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将List转换为List的java方法,其中T可以是整数或长_Java_Generics - Fatal编程技术网

将List转换为List的java方法,其中T可以是整数或长

将List转换为List的java方法,其中T可以是整数或长,java,generics,Java,Generics,给定一个列表,如何编写方法将其转换为列表,其中T可以是整数或长,但这仅在运行时可用。这是我能想出的代码。它似乎起作用了 这样做对吗? 可以进一步简化吗 public static void main(String[] args) { String s = "1, 2, 3, 4"; System.out.println(convertCSVStringToList(s, Integer.class)); System.out.println(convertCSVStrin

给定一个列表,如何编写方法将其转换为列表,其中T可以是整数或长,但这仅在运行时可用。这是我能想出的代码。它似乎起作用了


这样做对吗? 可以进一步简化吗

public static void main(String[] args) {
    String s = "1, 2, 3, 4";
    System.out.println(convertCSVStringToList(s, Integer.class));
    System.out.println(convertCSVStringToList(s, Long.class));
}

public static <T> List<T> convertCSVStringToList(String s, Class<T> type) {
    return Stream.of(s.split(","))
        .map(String::trim)
        .map(e -> valueOf(e, type))
        .collect(Collectors.toList());
}


private static <T> T valueOf(String s, Class<T> type) {
    T t = null;

    try {
        if (type.equals(Integer.class)) {
            t = (T) Integer.valueOf(s);
        } else if (type.equals(Long.class)) {
            t = (T) Long.valueOf(s);
        }
    } catch (NumberFormatException e) {
        System.err.println(String.format("Cannot convert <%s> to type %s", s, type.getSimpleName()));
    }

    return t;
}

与其提供一个类,不如提供一个函数给convertCSVStringToListmore一般来说,它可以是一个函数而不是提供一个类,不如提供一个函数给convertCSVStringToListmore一般来说,它可以是一个函数而不是传递一个类,这意味着您需要在valueOf方法中分别处理每种情况,您可以传递一个将字符串转换为所需对象的函数

System.out.println(convertCSVStringToList(s, Integer::valueOf));

public static <T> List<T> convertCSVStringToList(String s, Function<String, T> transformer) {
  ...
    .map(String::trim)
    .map(transformer)
  ...
}

您可以传递一个将字符串转换为所需对象的函数,而不是传递一个类(这意味着您需要在valueOf方法中单独处理每种情况)

System.out.println(convertCSVStringToList(s, Integer::valueOf));

public static <T> List<T> convertCSVStringToList(String s, Function<String, T> transformer) {
  ...
    .map(String::trim)
    .map(transformer)
  ...
}

代码是否抛出任何错误?输出是什么?你试过调试它吗?@mtk它能工作。问题更多的是,是否有更好的方法,这是正确的方法吗?基于泛型方法中的类型的if/else链通常表明它不是正确的方法。在本例中,您的代码还将生成安全的未经检查的强制转换警告;但这是编译器说我放弃的一个标志,你要计算出这是否正确。代码是否抛出任何错误?输出是什么?你试过调试它吗?@mtk它能工作。问题更多的是,是否有更好的方法,这是正确的方法吗?基于泛型方法中的类型的if/else链通常表明它不是正确的方法。在本例中,您的代码还将生成安全的未经检查的强制转换警告;但这是编译器说我放弃的一个信号,你要知道这是否正确。NumberFormatException呢?在OP的代码中,它映射为null。NumberFormatException呢?在OP的代码中,它映射为null。
System.out.println(convertCSVStringToList(s, Integer::valueOf));
System.out.println(convertCSVStringToList(s, Integer::valueOf));

public static <T> List<T> convertCSVStringToList(String s, Function<String, T> transformer) {
  ...
    .map(String::trim)
    .map(transformer)
  ...
}