MST

星途 面试题库

面试题:Java泛型通配符与集合的复杂操作

假设你有一个方法,需要接受一个集合参数,该集合可以存放任何类型的数字(Number及其子类)。请使用泛型通配符来定义这个方法的参数,并在方法内部实现对集合中所有元素求平均值的功能。注意处理可能出现的类型相关问题。
36.2万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
import java.util.List;

public class Main {
    public static double calculateAverage(List<? extends Number> numbers) {
        if (numbers == null || numbers.isEmpty()) {
            throw new IllegalArgumentException("集合不能为空");
        }
        double sum = 0;
        for (Number number : numbers) {
            sum += number.doubleValue();
        }
        return sum / numbers.size();
    }
}

你可以使用如下方式调用这个方法:

import java.util.ArrayList;
import java.util.List;

public class Test {
    public static void main(String[] args) {
        List<Double> doubleList = new ArrayList<>();
        doubleList.add(1.0);
        doubleList.add(2.0);
        doubleList.add(3.0);

        double average = Main.calculateAverage(doubleList);
        System.out.println("平均值: " + average);
    }
}

在上述代码中:

  1. calculateAverage 方法接受一个 List<? extends Number> 类型的参数,表示这个 List 可以存放 Number 及其子类类型的元素。
  2. 首先检查集合是否为空,如果为空则抛出 IllegalArgumentException 异常。
  3. 遍历集合,通过 number.doubleValue() 方法将每个 Number 对象转换为 double 类型并累加。
  4. 最后返回总和除以元素个数得到的平均值。

main 方法中,创建一个 List<Double> 并添加一些元素,然后调用 calculateAverage 方法并输出结果。

如果你使用的是其他编程语言,实现思路类似,下面以Python为例:

from typing import List, Union

Number = Union[int, float]

def calculate_average(numbers: List[Number]) -> float:
    if not numbers:
        raise ValueError("集合不能为空")
    total = sum(numbers)
    return total / len(numbers)


double_list = [1.0, 2.0, 3.0]
average = calculate_average(double_list)
print("平均值:", average)

在Python代码中:

  1. 定义了一个 Number 类型别名,表示可以是 intfloat 类型。
  2. calculate_average 函数接受一个 List[Number] 类型的参数,同样先检查列表是否为空,然后使用 sum 函数计算总和并返回平均值。
  3. 创建一个浮点数列表并调用函数输出平均值。