Kategorie szkoleń | Egzaminy | Kontakt
  • 1
  • 0
  • 58

Dlaczego poniższy kod się nie kompiluje?

import java.util.*;

class Book { }

public class BookList extends ArrayList<Book> {
  private static final long serialVersionUID = 1L;
  private int count = 0;

  public boolean add(Object o) {
    if (o instanceof Book)
      return super.add((Book) o);
    else
      return count++ == -1;
  }
}

 

  • Zapytał
  • @ | 29.11.2015
  • TRENER MODERATOR ALTKOM AKADEMII
Zaloguj się aby zadać pytanie
Pokrewne

Odpowiedź (1)

  • 0

Klasa BookList rozszerza klasę ArrayList<Book>, a tym samym dziedziczy m.in. jej metodę add o następującej sygnaturze:

public boolean add(Book o);

Na etapie kompilacji następuje utrata informacji o typach generycznych, co w naszym przypadku oznacza zastąpienie typu Book - typem Object (i dodawanie odpowiednich rzutowań). W efekcie tego procesu w klasie pojawią się dwie implementacje metody o tej samej sygnaturze.

To właśnie oznacza błąd: "Name clash: The method add(Object) of type BookList has the same erasure as add(E) of type ArrayList<E> but does not override it".

Gdyby zmienić sygnaturę metody add w klasie BookList na:

public boolean add(Book o) 

kod byłby poprawny, gdyż byłoby to przedefiniowanie metody z klasy przodka...

 

  • Odpowiedział
  • @ | 29.11.2015
  • TRENER MODERATOR ALTKOM AKADEMII