Wie erhalte ich den generischen Typ zur Laufzeit?

Dies ist mein Code: Der ExecutorImp erweitert AbstractExecutor, der die gleichen Ausführungslogiken seiner Implementierer extrahiert (ExecutorImp ist ein Fall). Wenn er die execute () - Methode von ExecutorImp aufruft, ruft er die Methode in ihrem Supertyp auf, aber den Supertyp (der AbstractExcutor) sollte eine andere Klasse kennen, die an den Implementierer gebunden ist (im Beispiel ist es die User-Klasse):

import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;

abstract class AbstractExecutor<E> {
    public void execute() throws Exception {
        ArrayList<E> list = new ArrayList<E>();
        // here I want to get the real type of 'E'
        Class cl = this.getClass().getTypeParameters()[0].getGenericDeclaration().getClass();
        Object o = cl.getConstructor(String.class).newInstance("Gate");
        list.add((E) o);
        System.out.println(format(list));
    }
    public abstract String format(ArrayList<E> list);
    public abstract String getType();
}

public class ExectorImp<E> extends AbstractExecutor<User> {
    @Override
    public String getType() {
        return "user";
    }
    @Override
    public String format(ArrayList<User> list) {
        StringBuffer sb = new StringBuffer();
        for (User u : list) {
            sb.append(u.toString() + " ");
        }
        return sb.toString();
    }
    public static void main(String[] args) throws Exception {
        new ExectorImp().execute();
    }
}
class User {
    String name;
    public User(String name) {
        this.name = name;
    }
}

SO, was ist das Problem mit meinen Codes?

Antworten auf die Frage(8)

Ihre Antwort auf die Frage