A dire il vero, se il metodo "peso()" è definito nella classe Oggetto, non serve affatto fare tutto quel casino... :


codice:
for(Oggetto o : p) {
   tot += o.peso();
}

Questo codice funziona tranquillamente (è la base del polimorfismo).

Inoltre, non vedo perchè tu non possa usare l'operatore ternario "?" nel modo che hai descritto. Quell'istruzione è perfettamente valida (ma, come già detto, inutile).

La terza domanda è più "complessa"... se tu sei sicuro che tutti gli oggetti "Oggetto" si dividono in istanze di "Libro" e istanze di "Regalo", non ci sono problemi e il test nell'else lo puoi tranquillamente saltare... se, al contrario, vi sono altre classi che estendono "Oggetto" e non hai la certezza che tutte le istanze di quell'array siano dei due tipi descritti, allora potresti incorrere in un ClassCastException nel caso tu provassi a castare un oggetto ad una classe che non c'entra nulla.

Ciao.