Доступ к общим членам класса и получить тип класса в Java - PullRequest
0 голосов
/ 03 января 2019

Я пытаюсь создать общий класс DAO для узлов графа в neo4j. У меня есть несколько классов графа узлов. Один из которых выглядит так

import org.neo4j.ogm.annotation.GeneratedValue;
import org.neo4j.ogm.annotation.Id;
import org.neo4j.ogm.annotation.Relationship;

public class Skill {
    @Id @GeneratedValue
    private Long id;
    private String Name;
    private String CleanedText;
    public final static String GraphIdentifier = "skill-ontology";

    @Relationship(type = "BelongsTo", direction = Relationship.OUTGOING)
    private Set<SkillSubCluster> belongsTo = new HashSet<>();

    public Long getId() {
        return id;
    }

    public String getName() {
        return Name;
    }

    public String getCleanedText() {
        return CleanedText;
    }
}

и мой класс GenericDAO -

public class NodeDAO<T> {
    private static final int DEPTH_LIST = 0;
    private static final int DEPTH_ENTITY = 1;
    final Class<T> typeParameterClass;
    private Session session;

    public NodeDAO(Session session, Class<T> typeParameterClass) {
        this.session = session;
        this.typeParameterClass = typeParameterClass;
    }

    public NodeDAO(Session session) {
        this.session = session;
        this.typeParameterClass = getEntityClass();
    }

    public Class<T> getEntityClass() {
        ParameterizedType parameterizedType = (ParameterizedType) getClass()
                .getGenericSuperclass();

        @SuppressWarnings("unchecked")
        Class<T> ret = (Class<T>) parameterizedType.getActualTypeArguments()[0];

        return ret;
    }


    protected Class<T> getEntityType() {
        return (Class<T>) this.typeParameterClass;

    }

    public Iterable<T> findAll() {
        return session.loadAll(getEntityType(), DEPTH_LIST);
    }

    // rest of the implementation
}

и затем у меня есть класс менеджера, который отвечает за подключение к нескольким экземплярам графа, чей единственный метод -

public <T> NodeDAO<T> getGraphNodeDAO(String graphDBIdentifier, Class<T> typeParameterClass){   

        // graphSessions is a hashmap<String, Session> storing multiple neo4j instances sessions. A session is identified by a graphDBIdentifier string
        Session session = graphSessions.get(graphDBIdentifier);
        // This works
        NodeDAO<T> nodeDAO = new NodeDAO<T>(session, typeParameterClass);
        //NodeDAO<T> nodeDAO = new NodeDAO<T>(session);
        return nodeDAO;
    }

Этот метод вызывается для получения объекта DAO для данного узла графа

NodeDAO<Skill> skillNodeDAO = manager.getGraphNodeDAO(Skill.GraphIdentifier, Skill.class); 

Код работает нормально, но я хочу, чтобы класс менеджера getGraphNodeDAO автоматически определял, какой сеанс загружать на основе проходов класса (на основе переменной класса GraphIdentifier класса Skill) и NodeDAO класс для автоматической идентификации class type самостоятельно с необходимостью явной его передачи.

Invoking NodeDAO<T> nodeDAO = new NodeDAO<T>(session); выдает следующую ошибку

Exception in thread "main" java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...