[hibernate-dev] Typing Help with JPA 2.1 impl

Steve Ebersole steve at hibernate.org
Wed Jun 13 15:55:03 EDT 2012


I need some help with generic types in the JPA 2.1 API, specifically 
with regard to the new Join#on and Fetch#on methods.  We ultimately 
unify those 2 interface hierarchies into a single hierarchy in out code 
using org.hibernate.ejb.criteria.JoinImplementor which extends from both 
Join and Fetch.

The problem I am facing is in the return types.  So, Join defines:
public interface Join<Z,X> {
     public Join<Z,X> on(...);
     ...
}

Fetch defines:
public interface Fetch<Z,X> {
     public Fetch<Z,X> on(...);
     ...
}


public interface JoinImplementor<Z,X>
         extends Join<Z,X>, Fetch<Z,X>, FromImplementor<Z,X> {
     ...
}

The compiler does not at all like JoinImplementor as is, so I have to 
override the method:

public interface JoinImplementor<Z,X>
         extends Join<Z,X>, Fetch<Z,X>, FromImplementor<Z,X> {
     public JoinImplementor<Z,X> on(...);
     ...
}

which should be fine as it is simple return type clarification.  And 
actually that definition compiles fine.

However, JPA also defines a whole hierarchy from Join such as. 
CollectionJoin, ListJoin, etc.  So Hibernate has for example:

public interface CollectionJoinImplementor<Z,X> extends 
JoinImplementor<Z,X>, CollectionJoin<Z,X> {
     @Override
     public CollectionJoinImplementor<Z, X> on(...);
     ...
}

The IDE is fine with this type signature, however trying to compile this 
leads to the following error:

types org.hibernate.ejb.criteria.JoinImplementor<Z,X> and 
org.hibernate.ejb.criteria.JoinImplementor<Z,X> are incompatible; both 
define on(javax.persistence.criteria.Predicate[]), but with unrelated 
return types

I have no idea what I need to do here.  Can anyone see the solution?


-- 
steve at hibernate.org
http://hibernate.org


More information about the hibernate-dev mailing list