Diskuze: Genericke metody
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 16 zpráv z 16.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
Zkus použít typ dynamic
A kód vkládej do textu - tlačítko </> to je nějaká epidemie, nebo co, že se všichni rozhodli dávat kód ve screenshotu?
Omlouvám se - beru zpět - nevšiml jsem si, že je to Java.
To s tím kódem platí.
T je v té třídě bez nějakého omezení, takže tam můžeš klidně vytvořit BankAccount<string> a pak zavolat insert<double>(5.0) a co pak?
spoiler:
potřebuješ omezit na number i to T
Nepojde to ani tak.Skusil som uz ciastku nastavit na typ T ,ktory extendoval Number ,skusil som aj to co pises,nepojde to ,lebo genericke typy(teda v podstate objekty) sa nedaju zlucovat matematickymi operatormi(+-*/ atd).Mozno by to slo cez metodu ale cez aku a ci vobec tak to neviem.
Máš pravdu, trieda Number nepodporuje aritmetické operácie, takže stále by si v princípe musel pretypovať na konkrétny typ, sčítať a potom pretypovať naspäť na generický typ. Na tvojom mieste by som radšej použil triedu BigDecimal.
import java.math.BigDecimal;
public class BankAccount {
private BigDecimal statusAccount = new BigDecimal(0);
public void insert(BigDecimal amount) {
statusAccount.add(amount);
}
}
Moc dobře to nepůjde, maximálně to zabít hodně ify a i tak můžeš dostat nějaké zaokrouhlovací chyby.
Pro ukládání desetinných čísel bez ztráty přesnosti je nejlepší použít BigDecimal.
A ještě otázka, k čemu je to dobré?
Dakujem za radu ,ale mne slo o to pouzit ten genericky typ.To mam za
ulohu.Prerobit kod, tak aby prijmal ako parametre metod konstruktora akykolvek
ciselny typ.
public class BankovyUcet {
private double stavUctu;
// constructors
public BankovyUcet() {
}
public BankovyUcet(double stavUctu) {
this.stavUctu = stavUctu;
}
// methods
public void vloz(double ciastka) {
this.stavUctu = stavUctu + ciastka;
}
public void vyber(double ciastka) {
this.stavUctu = stavUctu - ciastka;
}
public double zistiStavUctu() {
return stavUctu;
}
// getters setters
public double getStavUctu() {
return stavUctu;
}
public void setStavUctu(double stavUctu) {
this.stavUctu = stavUctu;
}
}
public class BankovyUcetTest {
public static void main(String[] args) {
BankovyUcet ucet1 = new BankovyUcet();
BankovyUcet ucet2 = new BankovyUcet(20);
ucet1.setStavUctu(0);
ucet2.setStavUctu(20);
System.out.println("Vas aktualny stav na ucte 1 je : " +
ucet1.zistiStavUctu() + "eur");
System.out.println("Vas aktualny stav na ucte 2 je : " +
ucet2.zistiStavUctu() + "eur");
System.out.println();
ucet1.vloz(10);
ucet2.vloz(15);
System.out.println("Vas aktualny stav na ucte 1 je : " +
ucet1.zistiStavUctu() + "eur");
System.out.println("Vas aktualny stav na ucte 2 je : " +
ucet2.zistiStavUctu() + "eur");
System.out.println();
ucet1.vyber(5);
ucet2.vyber(10);
System.out.println("Vas aktualny stav na ucte 1 je : " +
(ucet1.zistiStavUctu()) + "eur");
System.out.println("Vas aktualny stav na ucte 2 je : " +
(ucet2.zistiStavUctu()) + "eur");
}
}
Mam to urobit ako ulohu.Je to dobre asi len na trening pre takych ako ja ,ktory nemaju skusenosti s programovanim.
Ak používaš double
(pozor, nie Double
) ako
parameter metódy, tak Java implicitne skonvertuje argument, ktorý predávaš
metóde na typ double
. Funguje to ale iba na primitívnych
dátovych typoch. Ak chceš použiť aj genericitu, tak skús nejak takto.
public <N extends Number> void vloz(N ciastka) {
this.stavUctu = stavUctu + ciastka.doubleValue();
}
Poprípade môžeš tiež použiť operátor instanceof
na
zistienie dátového typu argumentu.
Nikdy za žádnou cenu nepoužívej typ double na finanční výpočty!!! Double je pro tyhle účely naprosto nevhodný typ, vzhledem k zaokrouhlování může dávat velmi nepřesné výsledky. Já bych na to šel asi tak, že bych interně ukládal stav účtu jako BigDecimal, přičemž bych konstruktor a metody udělal sice generické ale tak aby okamžitě vloženou hodnotu převedly na BigDecimal a počítali s tím. Asi takto:
public class BankAccount {
private BigDecimal statusAccount;
public <T extends Number> BankAccount(T value) {
this.statusAccount = new BigDecimal(value.toString());
}
public <T extends Number> void vloz(T amount) {
this.statusAccount = this.statusAccount.add(new BigDecimal(amount.toString()));
}
... //ostatní metody v podobném duchu
}
takhle napsanou třídu pak můžeš používat takhle:
BankAccount account = new BankAccount(50);
account.vloz(20);
account.vloz(356.25);
double d = 25.64
account.vloz(d); //zde je double okamžitě převeden na BigDecimal, takže nemůže napáchat žádnou škodu :)
Za doporučováni dynamic v c# by si měl být upálení, obzvláště pokud to doporucej místo prave generiky
Ach, kombinace autocorrect a omezení tohoto portálu, je vražedná.
Dakujem velmi pekne:).Konecne to ide podla predstav + new skill.
otázka k zamyšlení (ne vytahování apod)
nemáš zkušenosti s programováním a hned zkoušíš generiku?
Tym ,ze nemam skusenosti som myslel ,ze nemam pracovne skusenosti a nepracoval som na ziadnych realnych projektoch.Skusenosti mam z knih, tutotrialov,roznych online kurzov.
Zobrazeno 16 zpráv z 16.