Jump to content
  • 0

pomoc Java - Generická HashMapa


Invouk

Dotaz

Zdravím,

Mám taký menši problém s generickými triedami.
Potreboval by som spraviť generickú hashmapu, aby to fungovalo nejak podobne:

HasMap#get(key, Integer.class); // Takto vypadá metóda na getter
HashMap#put(key, Integer.class, 10); // takto vypadá metóda na setter


Generická trieda:

public static final class Generic<A> {

    private final Class<A> clazz;
    private Object object;

    public Generic(Class<A> clazz, Object object) {
        this.clazz = clazz;
        this.object = object;
    }

    public Class<A> getClazz() {
        return clazz;
    }

    public void setObject(Object object) {
        this.object = object;
    }

    public @NotNull A getObject() {
        if (object != null && object.getClass() == clazz)
            return (A) object;

        ChatInfo.GENERAL_INFO.sendConsole("[Generic] Generic class of " + clazz.getSimpleName() + " doesnt exist!");
        return null;
    }
}

a moja trieda na hashmapu upravenú

 

public static final class GenericMap<A> extends HashMap {

    public Object put(String key, Class<?> clazz, Object value) {
        return super.put(key, new Generic<>(clazz, value));
    }

    public A get(String key, Class<A> ab) {
        var a = ((Generic<A>) super.get(key));

        if(Objects.requireNonNull(a.getObject()).getClass() == a.getClazz())
            return (A) a.getObject();

        return null;
    }
}

image.png.688e818ade1ead0b8df1f4a582849932.png

Problém je, že mi to hádže object miesto Integer, a už si s tým nejako neviem rady, mordujem sa s tým dosť dlho.

Ďakujem za každú pomoc.

 

Link to comment
Share on other sites

5 odpovědí na tuto otázku

Recommended Posts

  • 0

Už som to nejako spravil, no akože stačila by hashmapa, ale prečo si to nespraviš jednoduhšie ??? Toho sa vždy držím a všetko si uľahčujem... ako písať pretypovanie objektov...
Ale každý primitivný typ má dedičnosť z Object, takže prečo by nešlo ?

DONE, môžete uzatvoriť, :D
 

public final class GenericMap extends HashMap {

    @Deprecated
    @Override
    public Object put(Object key, Object value) {
        throw new IllegalArgumentException("This method cannot be used in this map!");
    }

    @Deprecated
    @Override
    public Object get(Object key) {
        throw new IllegalArgumentException("This method cannot be used in this map!");
    }

    public <A> @Nullable Object put(String key, Class<A> clazz, A value) {
        return super.put(key, new Generic<>(clazz, value));
    }

    public <A> A get(@NotNull String key) { // Vráti objekt, ale nemusíš premienať ak to dávaš ako iný objekt...
        var value = ((Generic<A>) super.get(key));

        return value.getObject();
    }

    public <A> A get(@NotNull String key, Class<A> clazz) { // Vráti aj typ, ak zadáš clazz (Integer.class..)
        var value = ((Generic<A>) super.get(key));
        return value.getObject();
    }

}
Edited by XpresS
Link to comment
Share on other sites

  • 0

Uplne nerozumiem prečo tam posielaš ten Integer.class? je to nutné? veď generika su prave aby sa taketo niečo odstránilo :)

A pri get by ti stačilo return (A)super.get(); či?

Link to comment
Share on other sites

  • 0
před 1 hodinou, Quiter said:

Uplne nerozumiem prečo tam posielaš ten Integer.class? je to nutné? veď generika su prave aby sa taketo niečo odstránilo :)

A pri get by ti stačilo return (A)super.get(); či?

Hej ten getter som opravil, noo práve ale potom to hádže Object miesto konkrétneho primitivného typu.

Link to comment
Share on other sites

  • 0
před 13minutami, XpresS said:

Hej ten getter som opravil, noo práve ale potom to hádže Object miesto konkrétneho primitivného typu.

Primitivny typ nevies vratit ako object :D preto su obalovacie triedy ako napr. Integer

ked si vytvoris

TvojaMapa<Integer> mapa = new TvojaMapa<>();

tak 

public A get() {

     return (A)super.get();

}

ti vrati Integer pretoze to co ti vrati super.get pretypujes na A

 

naviac nestaci Java hashmapa? https://docs.oracle.com/javase/8/docs/api/java/util/HashMap.html

Edited by Quiter
Link to comment
Share on other sites

  • 0
před 20hodinami, XpresS said:

Už som to nejako spravil, no akože stačila by hashmapa, ale prečo si to nespraviš jednoduhšie ??? Toho sa vždy držím a všetko si uľahčujem... ako písať pretypovanie objektov...
Ale každý primitivný typ má dedičnosť z Object, takže prečo by nešlo ?

DONE, môžete uzatvoriť, :D

Ako myslíš jednoduchšie? Vždy je lepšie použiť už vytvorenú knižnicu :D To je jednoduchšie ako písať vlastnú :)

A tiež aké pretypovanie? Tu máš príklad na HashMapu priamo z javy a žiadne pretypovanie nepoužívam :) Taktiež používam primitívny typ int (pod kódom mam vysvetlené)

HashMap<String, Integer> hm = new HashMap<>();
int a = 5;
hm.put("haha", a);
int b = hm.get("haha");
System.out.println(b);
Integer c = 7;
hm.put("haha2", c);
Integer d = hm.get("haha2");
System.out.println(d);

A nie primitívne typy nemajú dedičnosť, preto sú primitívne (nie je to trieda a nemá metódy) :) Primitívne typy majú obaľovacie triedy a tie majú dedičnosť (napr. int -> Integer).

Preto ako generikum nemôžem použiť int ale musím použiť triedu Integer :) java automaticky konvertuje int na Integer ak je potreba a samozrejme aj opačne 

  • Líbí se mi to! (+1) 1
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...