Studuji Head First Java, ale nemohu pochopit, strana 544

hlasů
0

„Pokud deklarovat parametr typu pro třídu, můžete jednoduše použít tento typ libovolné místo, které byste používat skutečnou třídu nebo typ rozhraní. Typ vyhlášena v metodě argumentem je v podstatě nahrazen typem, který používáte, když instanci třída.

V případě, že samotná třída nepoužívá parametr typ, můžete stále zadat jednu pro metodu tím, že prohlásí ji opravdu neobvyklé (ale dostupný) space-before návratový typ, Tato metoda říká, že T může být „jakýkoli typ Zvíře.

Můžeš vysvětlit?

Položena 27/08/2009 v 01:24
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
7

Co to znamená, že v obecné třídě, můžete psát metody jako tak:

public T doSomething () {
}

Všimněte si, že návratový typ je ‚T‘.

Při kompilaci-time, bude tento typ vrácení této metody být co prošli do generické třídy, když ji instance.

Odpovězeno 27/08/2009 v 01:28
zdroj uživatelem

hlasů
1

V prvním odstavci, je to jen, jak generika pracovat pro výuku. Například na seznamu, můžete vytvořit seznam generického typu, jako je celé číslo, např:

ArrayList<Integer> list = new ArrayList<Integer>();

(v reálném kódu byste použít List<Integer>samozřejmě)

Nyní ArrayList bude definována jako:

public class Arraylist<T> { // implements....

    // ...

    public T get(int index) {
         // ...
    }
}

Což je to, co umožňuje používat getmetodu na lista získat Integer(protože jsme udělali třídu typu ArrayList<Integer>tak T = Integer). V opačném případě by kompilátor netuší, jaké typy objektů byl seznam ukládání a vy byste se dostat metodu vrátit Object, což je, jak to bylo.

To, co se druhý odstavec znamená, že můžete přidat parametry typu metod, stejně jako je to možné do tříd. např:

public <T> void noOp(T element) {
    // code here
}

To by vám umožní například vytvořit statické metody utilitu, která vrací něco typu T. Chcete-li se vrátit na první prvek v seznamu T je:

public static <T> T getFirst (List<T> list) {
    return list.get(0);
}

A můžete použít tuto metodu v silně napsaný způsobem. Návrhy na lepší příklady vítány. :-)

edit: Jen jsem si uvědomil, když jsem napsal něco, který používá tuto funkci. Byl jsem pomocí API SPS a dostat opravdu naštvaný na všechny ty časy, které mají vrátit něco (seznam nebo jednu položku) z dotazu, a běží na varování nekontrolovaných typu, protože neexistuje žádný způsob, jak odvodit typ zde. Pokud jste stejně jako já a snaží se vyhnout varování v kódu byste museli potlačit varováním pokaždé. Tak jsem napsal tuto metodu potlačit varování pro mě:

@SuppressWarnings("unchecked")
public static <T> List<T> returnResultList(Query query) {
    return (List<T>)query.getResultList();
}

Který přes kouzlo typu závěru funguje na:

List<Integer> list = returnResultList(query);
Odpovězeno 27/08/2009 v 13:02
zdroj uživatelem

hlasů
1
class Zoo<T> {
   static void putAnimal(T animal) {
       // do stuff
   }
}

Zoo<Ape> apeZoo = new Zoo<Ape>(); // you can now put apes (and chimps) here
Zoo<Reptile> monkeyZoo = new Zoo<Reptile>(); // this zoo takes reptiles

apeZoo.putAnimal(new Chimp());
monkeyZoo.putAnimal(new Tortoise());
Odpovězeno 27/08/2009 v 02:10
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more