使用地图的自定义包 class 不允许我从 class 的实例调用方法,这是关键

Custom bag class using a map doesn't allow me to call methods from the instance of a class which is the key

我正在尝试在 java 中编写一个 Bag 定制 class。 为此,我使用了一个地图,其中 Car 是 class.

的一个实例

在我的代码中,我无法从 Car class 调用函数,但我不明白为什么。

为了更好的理解,下面是代码。

BagTest.java

public class BagTest {
    public static void main(String[] args) {
         Car c1 = new Car("Model1", 15000);
        Car c2 = new Car("Model2", 20000);
        Car c3 = new Car("Model3", 12000);

        Bag bag = new Bag<Car>();
        bag.add(c1);
        bag.add(c2, 2);
        bag.add(c3);
    }
}

Car.java

final class Car implements Comparable<Car> {
    private final String _name;
    private final int _price;

    public Car(String name, int price) {
        this._name = name;
        this._price = price;
    }

    public String getName() {
        return (_name);
    }

    public int getPrice() {
        return (_price);
    }

    public boolean equals(Object car) {
        if (!(car instanceof Car))
           return (false);
        Car c = (Car)car;
        return (this._name.equals(c._name) && this._price == c._price);
    }

    public String toString() {
        return (this._name + " " + this._price);
    }

    public int hashCode() {
        return (31 * this._name.hashCode() * this._price);
    }

    @Override
    public int compareTo(Car car) {
        if (car == null)
            return (-1);
        if (this._price < car._price)
            return (-1);
        if (this._price == car._price)
            return (0);
        else
            return (1);
    }
}

Bag.java

class Bag <Car extends Comparable<Car>> implements Iterable<Car> {
    private Map<Car, Integer> _bag;

    public Bag() {
        this._bag = new TreeMap<>();
    }

    public void add(Car car) {
        if (car == null)
            return;
        if (this._bag.containsKey(car))
            this._bag.put(car, this._bag.get(car) + 1);
        else
            this._bag.put(car, 1);
    }

    public void add(Car car, int qty) {
        if (car == null || qty == 0)
            return;
        if (this._bag.containsKey(car))
            this._bag.put(car, this._bag.get(car) + qty);
        else
            this._bag.put(car, qty);
    }

    public void getCarsName() {
        for (Car car : this) {
            car.getName();  // HERE IS THE PROBLEM
        }
    }

    public Iterator<Car> iterator() {
        List<Car> carsList = new ArrayList<>();
        for (Car car: _bag.keySet())
        {
            int fr = _bag.get(car);
            for (int j = 0; j < fr; j++)
                carsList.add(car);
        }
        return (carsList.iterator());
    }
}

问题

问题是我无法访问 Car 的任何方法/变量。在上面的代码中,我无法访问方法 .getName()(在函数 getCarsName() 中,在文件 Bag.java 中),就像该方法不存在一样。

我也无法在包中创建新汽车 class,我收到以下错误:"Type parameter 'Car' cannot be instantiated directly"。它似乎与问题有关,并表明问题出在汽车 class,但我不知道它在哪里。

提前致谢。

正如您在下面看到的,car 变量的类型不是 Car 而是 Object(即使实例可能是 Car 类型)并且type Object 没有任何这样的方法。

...

for (Object car : this) {
    car.getName();
}

...

您必须按如下方式更改它。

...

for (Car car : this) {
    car.getName();
}

...

并更改 Bag class 声明如下。

class Bag implements Iterable<Car> {

    ...

}