IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Martin Balicky:22.7.2017 3:54

Zdravim , chcem vytvorit jednoduchu metodu bez navratovej hodnoty,ktora scitava dve genericke typy.Ciel je aby metoda prijmala akykolvek ciselny typ cize aby genericky typ extendoval Number.Vyhadzuje mi to chybu ,ze genericky typy sa nedaju scitavat.Da sa to nejako vyriesit?Vdaka za kazdu radu.

 
Odpovědět
22.7.2017 3:54
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na Martin Balicky
ostrozan:22.7.2017 6:56

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?

 
Nahoru Odpovědět
22.7.2017 6:56
Avatar
ostrozan
Tvůrce
Avatar
Odpovídá na Martin Balicky
ostrozan:22.7.2017 7:14

Omlouvám se - beru zpět - nevšiml jsem si, že je to Java.
To s tím kódem platí.

 
Nahoru Odpovědět
22.7.2017 7:14
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na Martin Balicky
Jan Vargovský:22.7.2017 11:44

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

 
Nahoru Odpovědět
22.7.2017 11:44
Avatar
Odpovídá na Jan Vargovský
Martin Balicky:22.7.2017 13:37

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.

 
Nahoru Odpovědět
22.7.2017 13:37
Avatar
wgamez101
Člen
Avatar
Odpovídá na Martin Balicky
wgamez101:22.7.2017 15:09

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);
  }

}
Nahoru Odpovědět
22.7.2017 15:09
There are only two kinds of programming languages: those people always bitch about and those nobody uses. -- Bjarne...
Avatar
gcx11
Tvůrce
Avatar
Odpovídá na Martin Balicky
gcx11:22.7.2017 15:21

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é?

 
Nahoru Odpovědět
22.7.2017 15:21
Avatar
Odpovídá na wgamez101
Martin Balicky:23.7.2017 0:50

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.setStavUc­tu(0);
ucet2.setStavUc­tu(20);

System.out.prin­tln("Vas aktualny stav na ucte 1 je : " + ucet1.zistiSta­vUctu() + "eur");
System.out.prin­tln("Vas aktualny stav na ucte 2 je : " + ucet2.zistiSta­vUctu() + "eur");

System.out.prin­tln();

ucet1.vloz(10);
ucet2.vloz(15);

System.out.prin­tln("Vas aktualny stav na ucte 1 je : " + ucet1.zistiSta­vUctu() + "eur");
System.out.prin­tln("Vas aktualny stav na ucte 2 je : " + ucet2.zistiSta­vUctu() + "eur");

System.out.prin­tln();

ucet1.vyber(5);
ucet2.vyber(10);

System.out.prin­tln("Vas aktualny stav na ucte 1 je : " + (ucet1.zistiS­tavUctu()) + "eur");
System.out.prin­tln("Vas aktualny stav na ucte 2 je : " + (ucet2.zistiS­tavUctu()) + "eur");

}

}

 
Nahoru Odpovědět
23.7.2017 0:50
Avatar
Odpovídá na gcx11
Martin Balicky:23.7.2017 0:55

Mam to urobit ako ulohu.Je to dobre asi len na trening pre takych ako ja ,ktory nemaju skusenosti s programovanim.

 
Nahoru Odpovědět
23.7.2017 0:55
Avatar
wgamez101
Člen
Avatar
Odpovídá na Martin Balicky
wgamez101:23.7.2017 1:26

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.

Nahoru Odpovědět
23.7.2017 1:26
There are only two kinds of programming languages: those people always bitch about and those nobody uses. -- Bjarne...
Avatar
Atrament
Tvůrce
Avatar
Odpovídá na Martin Balicky
Atrament:23.7.2017 2:08

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 :)
 
Nahoru Odpovědět
23.7.2017 2:08
Avatar
Odpovídá na ostrozan
Marian Benčat:23.7.2017 8:47

Za doporučováni dynamic v c# by si měl být upálení, obzvláště pokud to doporucej místo prave generiky

Editováno 23.7.2017 8:50
Nahoru Odpovědět
23.7.2017 8:47
Totalitní admini..
Avatar
Odpovídá na Marian Benčat
Marian Benčat:23.7.2017 8:51

Ach, kombinace autocorrect a omezení tohoto portálu, je vražedná.

Editováno 23.7.2017 8:51
Nahoru Odpovědět
23.7.2017 8:51
Totalitní admini..
Avatar
Odpovídá na Atrament
Martin Balicky:23.7.2017 14:01

Dakujem velmi pekne:).Konecne to ide podla predstav + new skill.

 
Nahoru Odpovědět
23.7.2017 14:01
Avatar
Lubor Pešek
Člen
Avatar
Odpovídá na Martin Balicky
Lubor Pešek:23.7.2017 20:49

otázka k zamyšlení (ne vytahování apod)
nemáš zkušenosti s programováním a hned zkoušíš generiku?

Nahoru Odpovědět
23.7.2017 20:49
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Avatar
Odpovídá na Lubor Pešek
Martin Balicky:23.7.2017 23:58

Tym ,ze nemam skusenosti som myslel ,ze nemam pracovne skusenosti a nepracoval som na ziadnych realnych projektoch.Sku­senosti mam z knih, tutotrialov,roznych online kurzov.

 
Nahoru Odpovědět
23.7.2017 23:58
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 16 zpráv z 16.