Errore di Casting

di il
2 risposte

Errore di Casting

Scusate ragazzi/e, non capisco come mai il codice scritto mi da un errore di casting.

import java.util.List;
import java.util.Objects;
import java.util.Optional;

public class Impiegato {

private final String nome;
private int salario;

public Impiegato(String nome, int salario) {
this.nome = nome;
this.salario = salario;
}

public String getNome() {
return nome;
}

public int getSalario() {
return salario;
}

@Override
public int hashCode() {
return Objects.hash(nome, salario);
}

@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Impiegato other = (Impiegato) obj;
return Objects.equals(nome, other.nome) && salario == other.salario;
}

public static int getMaxNome(List<Impiegato> l1) {

Optional<Impiegato> temp = l1.stream().sorted().findFirst();

return temp.get().getSalario();
}

}

Come mai mi esce il seguente errore?

Exception in thread "main" java.lang.ClassCastException: class compito22_06_2020.Impiegato cannot be cast to class java.lang.Comparable (compito22_06_2020.Impiegato is in unnamed module of loader 'app'; java.lang.Comparable is in module java.base of loader 'bootstrap').

In aggiunta non potevo scrivere qualcosa del genere:
int temp = l1.stream().sorted().findFirst().get().getSalario(); ?

Ringrazio tutti per la risposta che mi date e ringrazio anche per le risposte che ho ricevuto nei forum che ho aperto precedentemente. Senza voi non andavo da nessuna parte

2 Risposte

  • Re: Errore di Casting

    Bait ha scritto:


    Optional<Impiegato> temp = l1.stream().sorted().findFirst();
    Come mai mi esce il seguente errore?

    Exception in thread "main" java.lang.ClassCastException: class compito22_06_2020.Impiegato cannot be cast to class java.lang.Comparable (compito22_06_2020.Impiegato is in unnamed module of loader 'app'; java.lang.Comparable is in module java.base of loader 'bootstrap').
    Per poter fare un sorted() sugli Stream (e in generale un sort su liste/array), gli oggetti devono essere "comparabili" tra di loro, ovvero bisogna definire un determinato criterio di comparazione. Che nel tuo codice non c'è.

    In Java la comparazione e ordinamento degli oggetti è da sempre affrontato tramite l'utilizzo di due interfacce chiamate Comparable e Comparator, con scopi leggermente differenti. Se non hai le idee chiare su questi concetti, c'è il mio articolo: Comparazione e ordinamento degli oggetti in Java

    Il sorted degli Stream ha 2 varianti:
    - sorted() : si basa implicitamente su Comparable che deve essere implementato nella classe degli oggetti da comparare
    - sorted(Comparator<? super T> comparator) : si basa su un Comparator esplicito

    Quindi in base a cosa rappresenta e come deve essere il tuo criterio di comparazione, dovrai scegliere uno dei due.
  • Re: Errore di Casting

    Grazie mille! Chiarissimo. Usare comlarable non ho problemi mentre Comparator per ora si.
    Vedo anche i quiz. Grazie ancora!
Devi accedere o registrarti per scrivere nel forum
2 risposte