If the ChangeCargo use case knows the specific type of cargo it wishes to change, then there would likely be specific versions of this method for each cargo type.
If however, the change is itself agnostic of the cargo type, then it would be best to make use of polymorphism and delegate the update to each cargo subtype. The change could be expressed with a DTO, a value object or a few parameters.
For example (C#):
class ShippingContainer
{
List<Cargo> cargos;
public void ChangeCargo(string cargoId, DateTime expectedArrival, ...)
{
var cargo = this.cargos.FirstOrDefault(cargo => cargo.Id == cargoId);
cargo.Change(expectedArrival, ...);
}
}
class BigCargo : Cargo
{
public void Change(DateTime expectedArrival, ...) { }
}
class HazardousCargo : Cargo
{
public void Change(DateTime expectedArrival, ...) { }
}
The parameters starting with expectedArrival
could be a DTO or whatever best represents the change.