首页 > 解决方案 > 类型转换为泛型类型?

问题描述

public class NumberAnalyzer<T extends Number>{

public T average() {
    Double temp = 0.0;
    for (int i = 0; i < numberArray.size(); i++) {
        temp += numberArray.get(i).doubleValue();
    }
    temp /= numberArray.size();
    return (T) temp;
}

我将如何输入这个,所以当我传入 Integer 或 Double 时,它​​会给我传入的正确类型?目前,它总是以 Double 的形式返回。

这是你的意思吗?

public class NumberAnalyzer<T extends Number> {
private Function<Double, T> castFn;

NumberAnalyzer(Function<Double, T> castFn) {
    this.castFn = castFn;
}

private ArrayList<T> numberArray;
public T average() {
    Double temp = 0.0;
    for (int i = 0; i < numberArray.size(); i++) {
        temp += numberArray.get(i).doubleValue();
    }
    temp /= numberArray.size();
    return castFn.apply(temp);
}

这是我的测试课:

public static void main(String[] args) {
    ArrayList<Integer> intArrayListTest = new ArrayList<>();
    intArrayListTest.add(22);
    intArrayListTest.add(7);
    intArrayListTest.add(839);
    intArrayListTest.add(24);
    intArrayListTest.add(99);
    NumberAnalyzer<Integer> numTest = new NumberAnalyzer<>(intArrayListTest);

所以我正在寻找的答案是,如果我传入一个值为 8,9 和 66 的 int 数组,则平均值为:27

如果传递具有相同值的双精度数组,它将给我:27.66

目前,即使我传入一个 int,它也总是会返回一个 double 值。

标签: javagenericscasting

解决方案


将一个引用类型的变量转换为另一个引用类型实际上并没有对值做任何事情——这只是对编译器说“相信我,我知道的类型信息比你多”的一种方式。

因此,将 an 强制转换Integer为 aDouble不会使其成为 a Double,它只会诱使编译器相信该类型,从而在尝试将其Integer用作 a时导致后续问题Double

您不是要在这里投射,而是要转换.

您需要传入 aFunction<Double, T>或 a DoubleFunction<T>,作为方法或构造函数的参数。

public T average(Function<Double, T> castFn) {
   // ...
   return castFn.apply(temp);
}

或者

public class NumberAnalyzer<T extends Number>{
  private Function<Double, T> castFn;

  NumberAnalyzer(Function<Double, T> castFn) { this.castFn = castFn; }

  public T average() {
    // ...
   return castFn.apply(temp);
}

推荐阅读