Java enums de type générique

J'aimerais créer un générique enum à base de mapper pour IBatis. Je fais cela avec le code ci-dessous. Cela ne veut avoir le temps de compilation des erreurs, je ne sais pas comment le résoudre. Peut-être que ma solution est tout simplement faux (gardez à l'esprit que l'utilisation de IBatis), dans de tels cas, merci de proposer quelque chose de mieux.

Toute aide appréciée.

Ce que je veux réaliser est à définissent les mappeurs:

public class XEnumTypeHandler extends CommonEnumTypeHandler<X> {
}

Le code actuel:

public class CommonEnumTypeHandler<T extends Enum> implements TypeHandlerCallback {

 public void setParameter(ParameterSetter ps, Object o) throws SQLException {
  if (o.getClass().isAssignableFrom(**T**)) { 
   ps.setString(((**T**) o).value().toUpperCase());
  } else
   throw new SQLException("Excpected ParameterType object than: " + o);
 }

 public Object getResult(ResultGetter rs) throws SQLException {
  Object o = valueOf(rs.getString());
  if (o == null)
   throw new SQLException("Unknown parameter type: " + rs.getString());
  return o;
 }

 public Object valueOf(String s) {
  for (T pt : T.**values()**) {
   if (pt.**value()**.equalsIgnoreCase(s))
    return pt;
  }
  return null;
 }
}

J'ai ajouté erreur de marquage pour le code ci-dessus, les messages d'erreur sont dans l'ordre:

  • T ne peut pas être résolu
  • La méthode value() n'est pas défini pour
    le type T
  • La méthode values() n'est pas défini pour
    le type T
  • La méthode values() n'est pas défini pour
    le type T

J'ai résolu ce problème avec le code suivant:

public class CommonEnumTypeHandler<T extends Enum> implements TypeHandlerCallback {

    Class<T> clazz;

    public CommonEnumTypeHandler(Class<T> clazz) {
        this.clazz = clazz;
    }

    public void setParameter(ParameterSetter ps, Object o) throws SQLException {
        if (o.getClass().isAssignableFrom(clazz)) {
            ps.setString(((T) o).name().toUpperCase());
        } else
            throw new SQLException("Excpected " + clazz + " object than: " + o);
    }

    public Object getResult(ResultGetter rs) throws SQLException {
        Object o = valueOf(rs.getString());
        if (o == null)
            throw new SQLException("Unknown parameter type: " + rs.getString());
        return o;
    }

    public Object valueOf(String s) {
        return Enum.valueOf(clazz, s);
    }
}

Héritant de cette classe, je n':

public class SalesChannelTypeHandler extends CommonEnumTypeHandler<SalesChannel> {

    public SalesChannelTypeHandler() {
        super(SalesChannel.class);
    }

    public SalesChannelTypeHandler(Class<SalesChannel> clazz) {
        super(clazz);
    }

}
S'il vous plaît ajouter les erreurs du compilateur et une description de ce que vous êtes en train d'essayer de réaliser

OriginalL'auteur Marcin Cylke | 2010-06-15