public static void onAll(U u){ for(Integer i : u) Żeby działało? Te dwie linijki nie pokazują błędu jak jest
public static void onAll(U u){ for(Object i : u) Co chcę zrobić: wyciągnąć każdy element z listy u która zawiera same Integery. Chcę to koniecznie zrobić na typach generycznych, żeby się tego nauczyć.
@Detharon: łochuj, próbowałem dosłownie wszystkie kombinacje rzutowania i też z tym <>, zawsze miałem błąd, a to faktycznie działa xD nie wiem jak nie zauważyłem że dobrze było wtedy, może przez to że robiłem to wczoraj po północy Dzięki wielkie #ehhhhhhhhhhhhh ( ͡°ʖ̯͡°)
@Detharon a ogólnie dopuszczalne jest sprawdzanie czy element tablicy jest kwadratem liczby całkowitej w ten sposób? xD Math.sqrt( (double)(u.get(i))) == (int) (Math.sqrt( (double)(u.get(i)) ) )
@Bruno_: Z czego to co aktualnie robisz ma niezbyt duży sens. Pod każdy parametr funkcji możesz zawsze podstawić jego podtyp. Tak więc z powodzeniem możesz zdefiniować public static void onAll(List u){ i wywołać onAll(new ArrayList()) Jeśli chcesz się pouczyć generyków fajniejszym i bardziej życiowym przykładem mogłoby być zdefiniowanie funkcji w taki sposób.
public static void onAll(List list){ Wtedy będziesz mógł przekazać do niej zarówno listę Integerów jak i Doubli, czego
@Bruno_: coś strasznie dużo tych nawiasów i rzutowania jak na rzecz, która wydaje się być dość prosta ;f Możesz po prostu spierwiastkować daną liczbę (Math.sqrt) i sprawdzić, czy wynik jest liczbą całkowitą (operator reszty z dzielenia).
@GotoFinal: a jak inaczej powiniennem tego używać? czy to czasem nie chodzi o to żeby być w stanie różne funkcje dla różnych typów używać? np moja funkcja dla ArrayList bedzie sprawdzać czy jest tym pierwiastkiem liczby kwadratowej, a dla załóżmy Stringa bedzie robić cos innego
@Bruno_: no niezbyt, bo nie możesz tam przekazać array ze strigiem, a i nie do tego są generics, ale np wyobraź sobie metodę która przetwarza jakąś kolekcje i zwraca jej kopie:
public static > C doSomething(C collection, Supplier collectionCreator, Consumer operation){ i wtedy przekazując tam np ArrayList kompilator widzi też ze return type to też ArrayList i tak samo dla np HashSet return type to HashSet, jednak dalej w
@GotoFinal: czyli generyków używa się po to, żeby jedna metoda działała na kilku typach? Tam wcześniej to chodziło mi nie o ArrayList tylko o zwykły String
@Bruno_: typy generyczne pomagają tylko pilnować zależności między typami, bo to samo można by zrobić niby na
public static Collection doSomething(Collection collection, Supplier> collectionCreator, Consumer operation){ Tyle że wtedy byłoby to strasznie niewygodne - bo musiałbyś ręcznie pamiętać i kontrolować typy jakie używasz.
@GotoFinal @Detharon czyli to co pisałem wcześniej że generyki ograniczają typy które można zastosować do funkcji czy klasy to tak naprawdę ta funkcje pełni 'extends'? Czemu w takim razie proszę się Class xxx A nie Class xxx? Co to umożliwia? Zastosowanie dowolnego typu?
@Bruno_ białek coś psuje, nie da się edytować Podsumowując , bo chaotycznie napisałem Class xxx - musi klasa zawierające odgórnie zdefiniowane typy Class >A< xxx - może używać dowolnego typu Class >A extends Number< xxx - można przekazać dowolna liczbę np Integer, Double, Float ale nie typ prosty(int, double)
Jak zrobić coś takiego:
public static void onAll(U u){for(Integer i : u)
Żeby działało? Te dwie linijki nie pokazują błędu jak jest
public static void onAll(U u){for(Object i : u)
Co chcę zrobić: wyciągnąć każdy element z listy u która zawiera same Integery.
Chcę to koniecznie zrobić na typach generycznych, żeby się tego nauczyć.
Dzięki wielkie #ehhhhhhhhhhhhh ( ͡° ʖ̯ ͡°)
Math.sqrt( (double)(u.get(i))) == (int) (Math.sqrt( (double)(u.get(i)) ) )
public static void onAll(List u){
i wywołać onAll(new ArrayList())
Jeśli chcesz się pouczyć generyków fajniejszym i bardziej życiowym przykładem mogłoby być zdefiniowanie funkcji w taki sposób.
public static void onAll(List list){
Wtedy będziesz mógł przekazać do niej zarówno listę Integerów jak i Doubli, czego
public static > C doSomething(C collection, Supplier collectionCreator, Consumer operation){i wtedy przekazując tam np
ArrayListkompilator widzi też ze return type to teżArrayListi tak samo dla npHashSetreturn type toHashSet, jednak dalej wTam wcześniej to chodziło mi nie o ArrayList tylko o zwykły String
public static Collection doSomething(Collection collection, Supplier> collectionCreator, Consumer operation){Tyle że wtedy byłoby to strasznie niewygodne - bo musiałbyś ręcznie pamiętać i kontrolować typy jakie używasz.
Class /tu w nawiasie ostrym litera/ xxx
vs
Class xxx
Podsumowując , bo chaotycznie napisałem
Class xxx - musi klasa zawierające odgórnie zdefiniowane typy
Class >A< xxx - może używać dowolnego typu
Class >A extends Number< xxx - można przekazać dowolna liczbę np Integer, Double, Float ale nie typ prosty(int, double)