【问题标题】:Type casting to generic type?类型转换为泛型类型?
【发布时间】:2021-05-14 07:42:13
【问题描述】:
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 值。

【问题讨论】:

  • 旁白:使用double temp而不是Double temp,避免重复拆箱和装箱。
  • 您的变量tempDouble,所以当然该方法总是返回Double。转换非原始类型的变量不会以某种方式将对象从一种类型转换为另一种类型。

标签: java generics casting


【解决方案1】:

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

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

您不是要在此处转换,而是要转换

您需要传入 Function&lt;Double, T&gt;DoubleFunction&lt;T&gt;,作为方法或构造函数的参数。

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);
}

【讨论】:

  • 我收到此错误:线程“main”中的异常 java.lang.NullPointerException:无法调用“java.util.function.Function.apply(Object)”,因为“this.castFn”是空
  • "因为 "this.castFn" 为 null" 将其设置为 null 以外的值。
  • 我会将它设置成什么?抱歉,我不完全理解您添加的代码
  • 例如Double::intValued -&gt; (int) d.
  • 我应该把它放在哪里? castFn = d -> (int) d;在我的 NumberAnalyzer 类中?
猜你喜欢
  • 1970-01-01
  • 2015-11-17
  • 1970-01-01
  • 2020-06-16
  • 1970-01-01
  • 1970-01-01
  • 2012-11-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多