Generyki, type inference - jak to działa?

0
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
    }
}
public interface KlasaInterfejs{

    void sprawdzaj(Obiekt1 obiekt1, Obiekt2 obiekt2, Obiekt3 obiekt3);
}
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:

  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?

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:

 Arrays.asList(new KlasaTest()); 

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

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.

0

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

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

To działa :)

0

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1