Sì, ma il concetto "senza duplicati" è secondo il criterio fornito dal comparator, quindi sul prezzo. Se hai 3 prodotti con lo stesso prezzo, tiene solo il primo trovato e gli altri li ignora. È davvero quello che vuoi? (giusto per capire io)
Ok, se è un requisito ... ovviamente, no prob!
Scusa se ti segnalo queste cose ma è doveroso farlo:
- le tue classi fanno "troppe" cose, si occupano anche della interazione (con input!) verso l'utente. Non vanno affatto bene.
E il fatto poi che l'input lo fai nei setPrezzo/setSconto è decisamente brutto e poco pulito, soprattutto per quei try-catch in cui oltretutto invochi ricorsivamente il metodo (noooooo!).
- in setPrezzo di Prodotto prima fai l'assegnamento poi il controllo per negativo. Magari è meglio il contrario! Altrimenti il vincolo non è poi così un vincolo ... sì lanci una eccezione ma lo stato dell'oggetto in quel momento è cambiato.
- abituati e tenere le variabili di istanza tipicamente 'private'.
E ora veniamo al punto importante: getPrezzo in ProdottoScontato è un "override" di quello in Prodotto. Se hai una variabile di tipo Prodotto ma che fa riferimento ad un oggetto ProdottoScontato e invochi prod.getPrezzo(), il getPrezzo invocato è quello dell'oggetto realmente istanziato, ovvero del ProdottoScontato.
In sostanza, il comparatore, comparando i prezzi, concettualmente compara prezzi normali con prezzi "scontati".
E tra l'altro, perché fai:
sconto * 100 / super.getPrezzo()
?? Questo non applica uno sconto ... non ha molto senso ....