Typ generyczny w metodzie statycznej

0
class AlaMaKota<Rasa> {
   public static Rasa get(Class<Rasa> cls) ...
}

Taki coś a'la fabryka / singletonik Jak wiemy nie da się napisać.
Nie dyskutuję w powodami, rozumiem, klasa typowana musi mieć "instancję". Nawet jeśli jednym jedynym członkiem tej klasy jest metoda statyczna o wyraźnym (acz nieformalym) zdefiniowaniu typów. Ok, jasne.

... ale może jednak jest jakaś javowska hakerka, takie rzutowanie longa przez void * ?
Nie jest mi do niczego żywotnie potrzebne. Idea podczas drugiej kawy. Uniknąć rzutowania

Syjamska s = (Syjamska) AlaBezTypu.get(Syjamska.class)
0

Singleton :D :D :D

0

Wariant 'b' jednak z instancją

class AlaOdKota<R> {
   R get(Class<R> cls)
}
Syjamnski s = new AlaOdKota<Syjamski>().get(Syjamski.class);

w niczym nie jest lepsza od rzutowania, ta sama ilosc literek :)

Syjamnski s = (Syjamski) (new AlaOdKota().get(Syjamski.class)) ;
3
ZrobieDobrze napisał(a):

Taki coś a'la fabryka / singletonik Jak wiemy nie da się napisać.

No ciekawie się zapowiada.

Nie dyskutuję w powodami, rozumiem, klasa typowana musi mieć "instancję". Nawet jeśli jednym jedynym członkiem tej klasy jest metoda statyczna o wyraźnym (acz nieformalym) zdefiniowaniu typów. Ok, jasne.

Pierwsze słyszę.

... ale może jednak jest jakaś javowska hakerka, takie rzutowanie longa przez void * ?
Nie jest mi do niczego żywotnie potrzebne. Idea podczas drugiej kawy. Uniknąć rzutowania

Syjamska s = (Syjamska) AlaBezTypu.get(Syjamska.class)

Ale co Ty konkretnie próbujesz zrobić, bo nie rozumiem? Przecież jak wołasz metodę statyczną AlaMaKota.get() to skąd ten call miałby wziąć ten typ generyczny? A wołanie metody statycznej na instancji nie ma sensu - to się niczym nie różni od wołania jej na zadeklarowanym typie tej zmiennej (nie od runtimeowej wartości tej zmiennej, tylko tej zadeklarowanej).

Jak koniecznie chcesz metodę statyczną z typem generycznym, to możesz zrobić tak:

class AlaMaKota {
   public static <Rasa> Rasa get(Class<Rasa> cls) {
   }
}

i wywołać ją

AlaMaKota.<Syjamska>get(Syjamska.class);
2
ZrobieDobrze napisał(a):
Syjamnski s = new AlaOdKota<Syjamski>().get(Syjamski.class);

w niczym nie jest lepsza od rzutowania, ta sama ilosc literek :)

Rzutowanie w Javie, a w każdym razie w starej Javie, bo chyba w 19 jak sprawdzisz ifem typ, to możesz go rzutować bez lamentu kompilatora, zawsze jest niebezpieczne i zawsze będzie oflagowane warningiem. Czyli przynajmniej od tej strony jest lepiej.

W kategorii literek, też da się zrobić lepiej wykorzystując bieda wnioskowanie typów:

public class Main {

    public static void main(String[] args) throws InstantiationException, IllegalAccessException {
        Integer something = getSomething(Integer.class);
    }

    public static <R> R getSomething(Class<R> clazz) throws InstantiationException, IllegalAccessException {
        return clazz.newInstance();
    }
}

2

Kiedyś można było jeszcze prościej ale teraz depricated

class Main
{
    public static void main(String[] args) throws InstantiationException,IllegalAccessException
    {
        Syjamski cat = getSomething(Syjamski.class);
        //Integer i = getSomething(Integer.class); // nie rozszerza Cat
    }

    public static <T extends Cat> T getSomething(Class<T> cl) throws InstantiationException,IllegalAccessException
    {
        return cl.newInstance();
    }
}

class Cat {}
class Syjamski extends Cat {}

1 użytkowników online, w tym zalogowanych: 0, gości: 1