Generyki, type inference - jak to działa?

Generyki, type inference - jak to działa?
D3X
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 187
0
Kopiuj
public class KlasaService extends KlasaAbstract{

    public class KlasaTest implements KlasaInterfejs{

        @Override
        public void sprawdzaj(Obiekt1 obiekt1, Obiekt2 obiekt2, Obiekt3 obiekt3) {
        }
    }

    @Override
    protected List<KlasaInterfejs> tworzObiekt() {
        return Arrays.asList(new KlasaTest());  //TUTAJ JEST BLAD KOMPILACJI
    }
}
Kopiuj
public interface KlasaInterfejs{

    void sprawdzaj(Obiekt1 obiekt1, Obiekt2 obiekt2, Obiekt3 obiekt3);
}
Kopiuj
public abstract class KlasaAbstract implements KlasaInterfejs{

    private List<KlasaInterfejs> warunki;

    @Override
    public void sprawdzaj(Obiekt1 obiekt1, Obiekt2 obiekt2, Obiekt3 obiekt3) {
                           System.out.println("T");
    }

    protected abstract List<KlasaInterfejs> tworzObiekt();
}

Doszedłem do momentu gdzie pomogło rozwiązanie:

Kopiuj
  return Arrays.<KlasaInterfejs>asList(new KlasaTest());

Natomiast zastanawia mnie to czemu tak się dzieje i czemu musiałem to dopisać. Ponieważ jak dodam do parametrów asList dwa różne obiekty, które implementują interfejs to nagle Java wie jakiego to typu ma być - obiekt zwracany.

Dlaczego?

Jaca777
  • Rejestracja: dni
  • Ostatnio: dni
0

Lista typu KlasaTest nie jest podtypem listy typu KlasaInterface. Gdyby tak było, mógłbyś dodawać do tej listy instancje dowolnego supertypu KlasaTest. Natomiast:

Kopiuj
 Arrays.asList(new KlasaTest()); 

zwraca List<KlasaTest>, a nie List<KlasaInterface>.

Black007
  • Rejestracja: dni
  • Ostatnio: dni
0

Jaki jest ten błąd kompilacji?

Generici Są tylko "radą" (skrót myślowy - żeby nie było ;) ) w trakcie kompilacji, żeby sprawdzić, czy dana kolekcja ma pożądane elementy.
Tutaj nie ma. Jedna List ma KlasaTest a potem jest zwracana jako Lista KlasaInterfejs.
Używając <KlasaInterfejs> infromujesz kompilator że lista będzie miała obiekty implementujące KlasaInterfejs.

D3X
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 187
0

@Jaca777 No to jest jasne, ale w takim razie ta teoria trochę się burzy, bo jak już zrobisz:
@Black007

Kopiuj
 Arrays.asList(new KlasaTest(), new KlasaTest2());  

To działa :)

Jaca777
  • Rejestracja: dni
  • Ostatnio: dni
0

No tak, bo kompilator znajduje ich 'najbliższy' wspólny typ, czyli KlasaInterface.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.