Как реализовать опциональные колбэки?
Раз Unit - интерфейс, то заведи метод OnPlace, но у базового класса Unit он просто будет пустым. Т.е. вызывай его всегда. А конкретный Unit реализует то, что ему надо. 
Дженерик тут вообще не нужен. Просто внутри метода Unit проверяй, какой объект вызывал метод

Пример на Delphitype
  IUnit = interface;

  ILane = interface
    ['{494F502B-7659-4C5F-B72A-B6BFBF67F9B7}']
    procedure Place(Item: IUnit);
  end;

  IGroundLane = interface(ILane)
    ['{02D598FF-2AA9-4752-B808-44F8FE909B7B}']
  end;

  IUnit = interface
    ['{4EB084E7-9F79-40B6-92C0-A1A8C794F025}']
    procedure OnPlace(Sender: ILane);
  end;

  TUnit = class(TInterfacedObject, IUnit)
    procedure OnPlace(Sender: ILane); virtual;
  end;

  TMyUnit = class(TUnit)
    procedure OnPlace(Sender: ILane); override;
  end;

  TLane = class(TInterfacedObject, ILane)
    procedure Place(Item: IUnit);
  end;

impl

{ TUnit }

procedure TUnit.OnPlace(Sender: ILane);
begin
  // do nothing
end;

{ TLane }

procedure TLane.Place(Item: IUnit);
begin
  //add item
  Item.OnPlace(Self);
end;

{ TMyUnit }

procedure TMyUnit.OnPlace(Sender: ILane);
var
  Lane: IGroundLane;
begin
  if Supports(Sender, IGroundLane, Lane) then
    // it's IGroundLane
end;
Тут похоже ошибка в архитектуре. Логичнее было бы сделать чтобы Lane::Place(Unit *) вызывало какие-то методы у Unit, если это надо для конкретной реализации Lane (Эта логика будет в виртуальном методе, переопределенном в конкретных реализациях интерфейса).

Или Unit::OnPlaced(Lane*) всегда вызвает какие-то методы у Lane и вот они могут сказать, что Unit-у не надо ничего делать.

Ну, или раз вам вот так хочется сделать, то пишите шаблонный метод Unit::OnPlaced(T*), И ручками прописывайне инстанциировки с кокретными SkyLane, GroundLane и т.д. Ну и "дефолтную" реализацию пропишите пустую - вообще ничего не делающую для типа T*