С твердым C ++ за моей спиной некоторые концепции Java не ясны на 100%.
List<SomeInterface> list = new ArrayList<SomeImplementation>;
Это на 100% ясно, не нуждается в объяснении - но это имеет последствия ...
interface Drivable {...}
class Car implements Drivable {...}
class Bike implements Drivable {...}
class Skateboard implements Drivable {...}
class MyGarage{
List<Driveable> myRides;
public void addRides( List<Driveable> rideList ){...}
Не вызывается с List<Car>
. Однако я могу добавить автомобили в myRides:
public void addCars( List<Car> carList ){
myRides.addAll( new List<Driveable>( carList ) );
Q1: Это хорошая идея?
Мне бы очень хотелось, чтобы сработала первая функция. Делая что-то, что соответствует C ++ const&
и добавляя копию входящего carList в myRides, я думаю, carList будет защищен от несанкционированного доступа. Мои надежды на добавление final
в качестве аргумента функции были разбиты.
Q2: Есть ли способ заставить полностью вызываемую addRides(List<Driveable> rideList)
работать?
Перегрузка (List<Car> List<Bike> etc
) также недопустима.
И да, я могу сделать эту работу, добавив отдельные функции addBikes() addCars etc
или я могу сделать new List<Drivable>
в каждой точке вызова. Но я надеюсь на что-то более изящное.
Q3: Есть предложения?
Большое спасибо!
Адам