Wpis z mikrobloga

#java #naukaprogramowania

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ć.
  • 14
  • Odpowiedz
@Detharon: ł#!$%@?, 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 ( ͡° ʖ̯ ͡°)
  • Odpowiedz
@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)) ) )
  • Odpowiedz
@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 nie
  • Odpowiedz
@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).
  • Odpowiedz
@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
  • Odpowiedz
@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 środku
  • Odpowiedz
@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
  • Odpowiedz
@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.
  • Odpowiedz
via Android
  • 0
@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?
  • Odpowiedz
via Android
  • 0
Nie mogę edytować, nie wiem czemu. Oczywiście chodziło mi o różnice między
Class /tu w nawiasie ostrym litera/ xxx
vs
Class xxx
  • Odpowiedz
via Android
  • 0
@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)
  • Odpowiedz