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
Vous devez vous connecter pour publier un commentaire.
Je ne suis pas sûr de ce que vous êtes en train de faire (un aperçu général des mots serait bien), mais:
isAssignableFrom(T)
(vous avez besoin d'unClass
objet), et vous ne pouvez pas faireinstanceof T
(les génériques sont non-réifiée). Vous peut souhaitez passerClass<T>
type de jetons à la place.EnumMap
?Voir aussi
C'est pas encore clair ce qui est souhaité, mais c'est peut-être quelque chose le long des lignes de ce:
Nous utilisons donc des
Enum.valueOf
qui prend un type de jetonClass<T extends Enum<T>>
, et de lui demander pour leenum
constante avec un nom donné.valueOf
est PAS insensibles à la casse, mais par les conventions, les tous les constantes doivent être en majuscules, donc nous prenons simplement la chaîne de requête et de le transformer.toUpperCase()
.encore une fois, vous ne pouvez pas faire
T.values()
, mais si vous passez le type de jeton pourClass<T>
, vous seriez en mesure d'. Je vais vous donner un exemple, mais je ne suis toujours pas sûr de ce que vous êtes en train de faire.Juste essayer d'écrire un générique "de la chaîne de énum défini le type de convertisseur. Vous passez une chaîne dire "test" et d'obtenir des enum TestEnum.test
Je comprends ce que vous essayez d'atteindre, mais en face: les Génériques ne sont pas réifiée en Java! Vous avez besoin de passer d'exécution comme argument d'une méthode plutôt qu'compile-time type générique. Peut-être qu'un constructeur est-elle utile?
donc, vous voulez un casse Enum.valueOf? java.sun.com/javase/6/docs/api/java/lang/...
OriginalL'auteur polygenelubricants
Comme indiqué par Polygenelubricants, vous devez passer en béton runtime types de autour de, par exemple,
Class<?>
au lieu de syntaxique compile-time types comme des paramètres génériques. Voici une réécriture de la façon dont vous pourriez utiliser:Que vous pouvez ensuite utiliser comme suit:
Dans
setParameter
, changementisAssignableFrom
àenumClass.isInstance( o )
toutes les compétences, vous a permis de savoir que, je veux l'apprendre.
href="http://java.sun.com/docs/books/tutorial/jdbc/index.html" >en savoir JDBC et DAO et essayer de revoir tout de suite et encore maintenir la croix-DB-compatible. En d'autres termes: réinventer Hibernate / iBATIS / APP 😉
Long de la convivialité des réunions avec les clients. Je suis arrivé à des solutions similaires, mais Balus me battre en quelques secondes.
OriginalL'auteur BalusC