Tenho uma classe Pessoa e Evento e as duas extendem de uma classe abstrata chamada ItemDeVenda, por que não consigo fazer algo do tipo:
ArrayList<Pessoa> pessoas = new ArrayList<ItemDeVenda>();
Ele dá um erro dizendo que não pode converter de um tipo pra outro, se uma é filha da outra, por que o poliformismo não funciona?
Na prática o que quero fazer é receber uma lista genérica ItemDeVenda em um método e poder passar tanto uma lista de pessoa quanto de venda como parâmetro…
Hum, então você está comercializando pessoas?
Veja, teu modelo tem um erro, afinal, pessoa não é um item de venda (exceto em situações específicas).
Portando, reveja isso.
Você não vai conseguir instanciar daquela maneira. O ideal é declarar como uma lista de ItemDeVenda mesmo.
List<ItemDeVenda> lista = new ArrayList<ItemDeVenda>();
Aliás, hoje é mais comum você usar o operador diamante,
Sim, realmente tem um erro na modelo. Mas eu fiz isso pra evitar muitos métodos repetitivos. Nesse caso, isso vai servir de exercício pra alguns alunos na faculdade, então não preciso ser tão caxias nesse sentido rsrs… Na verdade meu problema não é adicionar classes filhas, mas passar como um parâmetro uma lista de classe filha pra um método que receba uma lista da classe pai (pra abstrair e economizar métodos), isso que não tô conseguindo…
Cara, se é para ser exercício, precisa ainda mais. Ensinar da forma correta evita muitos problemas.
Abstrair não significa economizar métodos, aliás, qual o intuito de economizar métodos? Você está fazendo uma imensa quantidade de cosias erradas a fim de justificar algo que não se justifica. Você deve usar o máximo de métodos que precisar e o máximo de classes que necessitar, para atender às boas práticas.
Se não quer usar algo complexo, faça algo simples.
Se a ideia é explorar o polimorfismo, não há necessidade de se trabalhar com coleções. Aliás, as coleções podem e devem ser empregadas em outros contextos.
Meu intuito foi de tentar simplificar (concordo que simplifiquei um lado mas acabei complicando outro), pois veja, uma Venda contém como atributos: Pessoa, Evento e Setor, então eles são “elementos” de uma venda… (é uma bilheteria)
eu notei que eu tinha vários métodos que faziam a mesma coisa (ir na lista, ver se existe e retornar true, outro método ia na lista, pegava pelo nome e retornava o objeto), no final eu vi que tinham 6 métodos repetitivos que mudava só em que lista iam aplicar a busca, e que usando abstração, poderia resumir em 2 e o comportamento ia mudar de acordo com os parâmentros passados (Pessoa, Evento, Setor). Concordo com vc que a modelagem ficou um pouco estranha, mas acho que foi um preço pequeno pra evitar código repetitivo de mais