Я предпочитаю # 2. Понятнее, что происходит, и он безопасен во время компиляции (я предпочитаю, чтобы во время компиляции было как можно больше ошибок, а не во время выполнения ... в общем, мне нравится, когда ничего не происходит) .
Edit:
Ну, есть два способа, которые я вижу ... Я думаю, это зависит от того, что вы будете использовать:
class Account
{
private Map<Region, TradeCollection> tradesByRegion;
}
class TradeCollection
{
private Map<Instrument, Trade> tradesByInstrument;
}
или
class Account<R extends Region, I extends Instrument, T extends Trade, C extends TradeCollection<I, T>>
{
private Map<R, C> tradesByRegion;
}
class TradeCollection<I extends Instrument, T extends Trade>
{
private Map<I, T> tradesByInstrument;
}