Fehler beim instanzieren einer Generischen Klasse

goodcat

Aktives Mitglied
Hi,

ich habe ein Problem und zwar habe ich eine Generische Hibernate DAO geschrieben.

Hier mein Code:
Java:
public class GenericDAOImpl<T, PK extends Serializable> extends HibernateDAO implements GenericDAO<T, PK> {

	protected Class<T> entityClass;

	@SuppressWarnings("unchecked")
	public GenericDAOImpl() {
	    ParameterizedType genericSuperclass = (ParameterizedType) getClass().getGenericSuperclass();
	    this.entityClass = (Class<T>) genericSuperclass.getActualTypeArguments()[0];
	}

...

Wenn ich eine neue KLasse erstee und mittels extends die Generische KLasse erweitere funktioniert alles und ich habe Zugriff auf die DB.
Jetzt möchte ich aber die Klasse mittels "new" Operator in einer Klasse instanzieren ich glaube man nennt das Komposition. Hier die Fehlermeldung:
Java:
java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType
	at de.timetracker.core.genericdao.GenericDAOImpl.<init>(GenericDAOImpl.java:16)
	at de.timetracker.test.TestFrame.<init>(TestFrame.java:23)
	at de.timetracker.test.TestFrame$1.run(TestFrame.java:33)
	at java.awt.event.InvocationEvent.dispatch(Unknown Source)
	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
	at java.awt.EventQueue.access$200(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)

Es hat irgendwas mit dem Casten der Klasse im Konstruktor zutun. Problem, ich habe keine Ahnung wie ich das korrigieren kann. Jemand eine Idee?
 
Zuletzt bearbeitet:
In Zeile 23 versuche ich das Objekt zu instanzieren:
Java:
private GenericDAOImpl<ObjectStatus, Integer> dao = new GenericDAOImpl<ObjectStatus, Integer>();
 
Java:
  ParameterizedType genericSuperclass = (ParameterizedType) getClass().getGenericSuperclass();
  this.entityClass = (Class<T>) genericSuperclass.getActualTypeArguments()[0];
Dieser Code funktioniert nur in Subklassen von GenericDAOImpl. GenericDAOImpl ist damit nicht mehr selbst instanzierbar. Macht meiner Meinung nach aber eh keinen Sinn. Also mach sie am besten abstrakt. Alternativ, verzichte auf den Comfort dieser Lösung und übergib das Klassenobjekt als Konstruktorparameter.
 
Ok also die Klasse bleibt Generisch. Hier meine Änderung.
Java:
public class GenericDAOImpl<T, PK extends Serializable> extends HibernateDAO implements GenericDAO<T, PK> {

	protected Class<T> entityClass;

	@SuppressWarnings("unchecked")
	public GenericDAOImpl(Class<T> entityClass) {
//	    ParameterizedType genericSuperclass = (ParameterizedType) getClass().getGenericSuperclass();
//	    this.entityClass = (Class<T>) genericSuperclass.getActualTypeArguments()[0];
		this.entityClass = entityClass;
	}

...

Wenn ich jetzt mit:
Java:
private MyModel<ObjectStatus> model = new MyModel<ObjectStatus>(ObjectStatus.class);
die klasse instanziere scheint alles zu funktionieren.

Nach GenericDAOImpl kommt noch eine Service Klasse die GenericDAOImpl erweitert und dann wollte ich eigentlich ein Abstraktes bzw. Generische Model haben, nur wenn ich in MyModel nicht die Objekte instanzieren kann, kann ich kein generisches Model schaffen.

Mal so ne andere Frage, in welche Klasse gehört denn der Code der mir meine Daten in Form eines ComboBoxModel's oder TableModel's liefert?
- DAO eher nicht?!
- Service?
- oder Model?
 
Ok also die Klasse bleibt Generisch
Hab auch nicht geschrieben, dass sie das nicht bleiben soll. Abstrakt ist nicht ungenerisch. Du kannst aber beides machen:
Java:
     /**
      * Public constructor für direkte Instanzierung.
      **/
    @SuppressWarnings("unchecked")
    public GenericDAOImpl(Class<T> entityClass) {
        this.entityClass = entityClass;
    }

    /**
      * Parameterloser Konstruktor für die Benutzung durch Subklassen
      * Deswegen protected
     **/
    protected  GenericDAOImpl(){
      ParameterizedType genericSuperclass = (ParameterizedType) getClass().getGenericSuperclass();
      this.entityClass = (Class<T>) genericSuperclass.getActualTypeArguments()[0];
    }
 

Neue Themen


Zurück
Oben