当尝试使用循环从Map中提取值时,“HashMap $ Entry无法转换为X”

时间:2014-06-06 01:47:55

标签: java list hashmap

public class CarService implements ICarService {
private final Map<String, Car> carMap = new HashMap<String, Car>();

@Override
public List<Car> findAll() {
    final ArrayList<Car> al = new ArrayList<Car>();
    for (final Map.Entry<String, Car> entry : carMap.entrySet()) {
        al.add((Car) entry);
    }
    return al;
}
}

我有一个类名CarService,它将从carMap获取所有信息并存储到List中。但是我收到错误表明“java.util.HashMap $ Entry无法转换为Car”

final CarService carSvc = new CarService();
List<Car> getAllCar = new ArrayList<>();
getAllCar = carSvc.findAll();
System.out.println(getAllCar.size());

这是我调用汽车服务的主要功能

3 个答案:

答案 0 :(得分:3)

问题出在你的for循环中。

for (final Map.Entry<String, Car> entry : carMap.entrySet()) {
    al.add((Car) entry);
}

在此,您将entry声明为Map.Entry<String, Car>。您无法以任何方式将其强制转换为Car。您需要获取Map.Entry并将其添加到a1

您可以使用getValue() method执行此操作。如,

for(final Map.Entry<String, Car> entry : carMap.entrySet()) {
    a1.add(entry.getValue());
}

由于你的类型参数,最后根本不需要进行投射。

答案 1 :(得分:2)

正如所指出的那样,原始代码导致运行时错误,因为Map.Entry对象不是Car(因此转换无效)。

话虽如此,由于不需要密钥,因此可以使用Map#values

for (final Car car : carMap.values()) {
    al.add(car);
}

或者,“没有循环马!”

List<Car> cars = new ArrayList<Car>(carMap.values());

答案 2 :(得分:2)

为什么不简单呢?:

List<Car> cars = new ArrayList<>(carMap.values());

HashMap#values()返回Collection<T>,然后您可以直接提供给ArrayList构造函数。