Подтвердить что ты не робот

Передача в подкласс к методу, но имеющий суперкласс как параметр?

У меня есть абстрактный класс Vehicle с 2 реализованными подклассами RedVehicle и YellowVehicle.

В другом классе у меня есть List<Vehicle> содержащий экземпляры обоих подклассов. Я хочу, чтобы иметь возможность передать в метод тип класса, а затем использовать этот тип, чтобы решить, какой набор объектов я хочу сделать в List.

Так как Class является общим, я должен каким-то образом параметризовать его, однако, поместив параметр в качестве родительского класса Vehicle, он перестает работать с вызывающим кодом, так как exampleMethod теперь ожидает тип транспортного средства, а не подкласс RedVehicle или YellowVehicle.

Я считаю, что должен быть чистый способ сделать это, чтобы быть правильным способом реализовать функциональность?

n.b. Мне не обязательно проходить в типе Class, если есть лучшие предложения, я был бы счастлив попробовать их.

Код вызова:

service.exampleMethod(RedVehicle.class);
service.exampleMethod(YellowVehicle.class);

Поля/Метод:

//List of vehicles
//Vehicle has 2 subclasses, RedVehicle and YellowVehicle
private List<Vehicle> vehicles;

//Having <Vehicle> as the Class parameter stops the calling code working
public void exampleMethod(Class<Vehicle> type) 
{
    for(Vehicle v : vehicles)
    {
        if(v.getClass().equals(type))
        {
            //do something
        }
    }
}
4b9b3361

Ответ 1

Сделайте это вместо:

public <T extends Vehicle> void exampleMethod(Class<T> type) 

Ответ 2

Почему бы вам не использовать шаблон ?

Таким образом, вы

  • не нужны маркеры типа
  • пусть динамическая диспетчеризация обрабатывает различие дела (вместо if(v.getClass().equals(type)))
  • более гибкие (после OCP)

Подробнее:

ваш абстрактный класс Vehicle получает метод accept(Visitor v), причем подклассы реализуют его, вызывая соответствующий метод на v.

public interface Visitor {
  visitRedVehicle(RedVehicle red);
  visitYellowVehicle(YellowVehicle yellow);
}

Использование посетителя:

public class Example {

  public void useYellowOnly() {
    exampleMethod(new Visitor() {
        visitRedVehicle(RedVehicle red) {};
        visitYellowVehicle(YellowVehicle yellow) {
             //...action
        });
  }
  public void exampleMethod(Visitor visitor){
      for(Vehicle v : vehicles) {
          v.accept(visitor);
      }  
  }
}