2016-03-09 10 views
0

Я пытаюсь закодировать собственный пользовательский класс Bag в java. Для этого я использую карту, где Car является экземпляром класса.Пользовательский класс сумм с использованием карты не позволяет мне вызывать методы из экземпляра класса, который является ключом

В моем коде я не могу вызвать функцию из класса Car, но я не могу понять, почему.

Вот код для лучшего понимания.

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

Задача

Проблема в том, что я не могу найти какой-либо метод/переменную автомобиля. В приведенном выше коде я не могу получить метод .getName() (в функции getCarsName(), в файле Bag.java), это похоже на то, что метод не существует.

Также я не могу создать новый автомобиль в классе Bag, у меня возникла следующая ошибка: «Параметр типа« Автомобиль »не может быть создан непосредственно». Кажется, что это связано с проблемой и будет казаться, что проблема исходит из класса Car, но я не могу понять, где она.

Заранее спасибо.

ответ

1

Как вы можете видеть ниже, тип car переменной не Car но Object (даже если экземпляр может быть типа Car) и типа Object не имеет такой метод.

... 

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

... 

Вы должны изменить его следующим образом.

... 

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

... 

А также внести поправку в категорию Bag следующим образом.

class Bag implements Iterable<Car> { 

    ... 

} 
+0

Поскольку каждый класс имеет объект как supperclass в java, это не изменит никакого значения. Я проверял, чтобы быть уверенным, но да, это ничего не меняет в этой проблеме. – Havli

+0

Да, каждый класс прямо или косвенно распространяется на объект, но это не значит, что вы можете вызвать метод, определенный в подтипе, посредством ссылки типа Object. – pgiecek

+0

Фактически, я только что проверил, и объект получил другое поведение, чем я думал, я изменил свой код, но проблема все еще здесь. – Havli

 Смежные вопросы

  • Нет связанных вопросов^_^