在使用泛型的方法中传递数据?这可能吗?

时间:2018-04-27 02:01:13

标签: java generics

我正在尝试了解如何使用使用通用的方法。我想创建一个可以将数据传递给它的通用方法。例如,我想创建一个数组,并在方法中添加一个变量。 Byetheway我正在使用 Java

这是我正在尝试的代码:

[1,2]

所以我的代码中的一行肯定是错的,但我怎么能这样做?

使用Generic并将数据传递给它的方法

3 个答案:

答案 0 :(得分:0)

如果要使用generic来添加数组元素,请考虑扩展Number类型 例如:

public class Main {


    static int d;

    public static <E extends Number> void AdditionArray(E[] arr, int var) {
        for (E element : arr) {
            d = element.intValue() + var; //this is the big problem, I have no idea whether this is possible or not
            System.out.println(d);
        }

    }

  static String z;
   public static <E extends CharSequence> void AdditionArray2(E[] arr, int var) {
    for (E element : arr) {
        z += element.toString() + var; //this is the big problem, I have no idea whether this is possible or not
        System.out.println(z);
    }
}


    public static void main(String[] args) {
       Integer[] arr1 = {1, 4, 5, 7};
       AdditionArray(arr1, 2);
       Double[] arr2 = {1.0, 4.0, 5.0, 7.0};
       AdditionArray(arr2, 2);

       String[] arr3 = {"a", "b", "c", "d"};
       AdditionArray2(arr3, 2);


    }

}

答案 1 :(得分:0)

这是正确的吗? XD

public class Main {
static String d;

public static <E extends Object> void AdditionArray(E[] arr, String var) {
    for (E element : arr) {
        d = element.toString() + var; // String
        System.out.println(d);
    }

}
    public static void main(String[] args) {
         String[] arr1 = {"Hello"};
         AdditionArray(arr1, "World");
    }
}

答案 2 :(得分:0)

如果你熟悉Lambda是什么,你可以使用lambdas在Java 8+中非常简洁地完成这项工作。

这是一个例子

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Function;

public class GenericAddition {

public static <E> List<E> map(List<E> elements, Function<E, E> mapper) {
    List<E> result = new ArrayList<>();
    for (E element : elements) {
        result.add(mapper.apply(element));
    }
    return result;
}

public static void main(String...args) {
    List<Integer> addedThree = map(Arrays.asList(5, 3, 4), (elem) -> elem + 3);
    System.out.println(addedThree);

    List<String> concatted = map(Arrays.asList("good", "guten", "baz"), (elem) -> elem + " day");
    System.out.println(concatted);
  }
}

这将打印出来:

[8, 6, 7]
[good day, guten day, baz day]

一个问题是你必须使用List类型,因为使用E []可能是一个基元数组,但你的mapper函数需要接受对象(因为类型参数必须是对象类型)。您可以通过添加一个将数组转换为列表的包装函数来轻松编写此限制的代码,Java将是智能的,并在这种情况下为您执行自动装箱。

我个人认为这是非常可读的,而且非常灵活,因为你可以定义任何类型的逻辑来执行映射,即如果我想要做一些像添加5,如果它的奇数,或* 2如果它的偶数,我可以定义我自己的lambda函数用于执行此操作。这样,我可以获得更复杂的行为,而无需为我想要的每种不同类型编写单独的方法。

如果您使用的是较旧的Java版本,则可以使用实现特定接口的匿名内部类做同样的事情。