Avatar billede thecokeguy Nybegynder
02. august 2009 - 23:37 Der er 3 kommentarer og
2 løsninger

Typecasting af ukendt subklasse

Jeg har konstrueret flg.:

public static FPClass getSubFP(String subClass, LinkedList<FuncPart> args) {
    try { 
        Class fpClass = Class.forName(subClass);
        Constructor fpConstructor = fpClass.getConstructor(LinkedList.class);
        Object fpObject = fpConstructor.newInstance(new Object[]{args});
        return fpObject;
    } catch (Exception e) {
        System.out.println("Error... Could not find class");
    }     

    return null;
}

Ideen var at jeg skulle kunne returnere en hvilken som helst subklasse af FPClass bare på baggrund af dens navn. Men jeg ved ikke helt hvordan jeg skal overbevise Java om at fpObject er en subklasse af FPClass og derfor godt må returneres... Nogen forslag?
Avatar billede arne_v Ekspert
03. august 2009 - 02:48 #1
Enten kan du bare caste dit fpObject eller så skal du angive nogle generiske parametre.

Demo:

import java.lang.reflect.Constructor;

public class GenFun {
    private static P giveMe1(String clznam, int v) throws Exception {
        Class clz = Class.forName(clznam);
        Constructor ctor = clz.getConstructor(int.class);
        return (P)ctor.newInstance(v);
    }
    private static P giveMe2(String clznam, int v) throws Exception {
        Class<? extends P> clz = Class.forName(clznam).asSubclass(P.class);
        Constructor<? extends P> ctor = clz.getConstructor(int.class);
        return ctor.newInstance(v);
    }
    public static void main(String[] args) throws Exception {
        P o1 = giveMe1("C", 123);
        System.out.println(o1);
        P o2 = giveMe2("C", 123);
        System.out.println(o2);
    }
}

class P {
    protected int v;
    public P(int v) {
        this.v = v;
    }
    @Override
    public String toString() {
        return "P: " + v;
    }
}

class C extends P {
    public C(int v) {
        super(v);
    }
    @Override
    public String toString() {
        return "C: " + v;
    }
}
Avatar billede thecokeguy Nybegynder
03. august 2009 - 02:55 #2
Av, det var en ordentlig omgang... Løste det selv for at par min siden til flg.:

public static FPClass getSubFP(String subClass, LinkedList<FuncPart> args) {
    try {
        Class<? extends FPClass> fpClass = Class.forName(subClass).asSubclass(FPClass.class);
        Constructor fpConstructor = fpClass.getConstructor(LinkedList.class);
        Object fpObject = fpConstructor.newInstance(new Object[]{args});
        return fpClass.cast(fpObject);
    } catch (Exception e) {
        System.out.println("Error... Could not find class");
    }   

    return null;
}
Avatar billede thecokeguy Nybegynder
03. august 2009 - 02:55 #3
Du smider selv. bare et svar hvis du vil have point for din deltagelse.
Avatar billede arne_v Ekspert
03. august 2009 - 03:03 #4
Class<? extends FPClass> fpClass = Class.forName(subClass).asSubclass(FPClass.class);
        Constructor fpConstructor = fpClass.getConstructor(LinkedList.class);
        Object fpObject = fpConstructor.newInstance(new Object[]{args});
        return fpClass.cast(fpObject);

må kunne laves ligesom min kode 2:

        Class<? extends FPClass> fpClass = Class.forName(subClass).asSubclass(FPClass.class);
        Constructor<? extends FPClass> fpConstructor = fpClass.getConstructor(LinkedList.class);
        return fpConstructor.newInstance(new Object[]{args});
Avatar billede arne_v Ekspert
03. august 2009 - 03:04 #5
og et svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester