Как вернуть подсписок объектов Generic типа?

Добрый день. Вопрос пока более теоретический. Допустим у нас есть иерархия

class Vehicle {}
class Light  : Vehicle {}
class Medium : Vehicle {}
class Heavy  : Vehicle {}


Так же есть коллекция:

class VehicleCollection {
  
  private List<Vehicle> vehicles = new List<Vehicle>();

  public void AddVehicle (Vehicle vehicle) {
    vehicles.Add( vehicle );
  }

  public void List<T> GetAllByType() where T : Vehicle {
    List<T> list = new List<T>();
    // todo
    return list;
  }
}


Подскажите, пожалуйста, как корректно написать метод, чтобы он возвращал массив экземпляров подтипа, при этом чтобы можно было передать только один из подклассов (скажем, RocketMan должен валиться на этапе компиляции). Как такое написать и на C# и на Java? Насколько такой код хорошо оптимизируется компилятором?

List<Light> lightVehicles = vehicleCollection.GetAllByType<Light>();


Самый простой пример подобного использования, который я знаю - GetComponent<>() в юнити:

Rectangle rectangle = GetComponent<Rectangle>();
  • Вопрос задан
  • 291 просмотр
Решения вопроса 1
dordzhiev
@dordzhiev
Подскажите, пожалуйста, как корректно написать метод, чтобы он возвращал массив экземпляров подтипа,

public void List<T> GetAllByType() where T : Vehicle 
  {
    return vehicles.OfType<T>().ToList();
  }


при этом чтобы можно было передать только один из подклассов (скажем, RocketMan должен валиться на этапе компиляции)

За счет where T : Vehicle он и так не даст скомпилировать.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@SaertiS
по части Java: <T extends Venichle> в сигнатуру метода добавить и при формировании выдачи проверять на инстанс.

ps. <? extends Venichle> конечно же )
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Hamilton Apps Москва
от 150 000 до 300 000 ₽
ЭЛКОМ+ Москва
от 70 000 до 165 000 ₽
deeplay Новосибирск
от 130 000 до 200 000 ₽
17 янв. 2021, в 01:26
100000 руб./за проект
16 янв. 2021, в 22:34
10000 руб./за проект
16 янв. 2021, в 22:33
20000 руб./за проект