Question

[javac] C:\ws\galileo\test\Cacheable.java:13: incompatible types
[javac] found   : com.io.CacheType
[javac] required: com.io.CacheType
[javac]  public CacheType id() default CacheType.COMMON;

Je ne comprends vraiment pas celui-ci. J'ai un projet dans lequel je construis sur mesure un intercepteur de mise en cache pour Spring. Il s'agit simplement d'une recherche par nom de cache pour pointer sur EhCache et utiliser aop-autoproxy pour charger CacheableAspect (qui est mon intercepter de mise en cache). Maintenant, lorsque j'utilise la valeur par défaut dans l'annotation, ANT me donne l'erreur de compilation ci-dessous. J'ai essayé de mettre à jour le dernier JDK (je suis sur 1.6 16 maintenant) et de définir les niveaux source / cible dans le script ant, mais sans succès. Lorsque je supprime la valeur par défaut et force toutes les zones à spécifier une valeur, la compilation est effectuée avec précision.

Cela a toujours fonctionné sous Eclipse, j'avais des tests unitaires qui fonctionnaient parfaitement avec la valeur par défaut précédente.

Qu'est-ce qui donne? J'ai essayé de construire un projet (pas de ressort) qui répercutait simplement la configuration avec ant et celui-ci était compilé en ant (et en éclipse).

qui me dit peut-être que ce pourrait être le printemps auto-procuration en quelque sorte? mais alors pourquoi le compilateur ne me donnerait-il pas le nom du type généré? GRRRR. Des pensées?

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import com.io.CacheType;

@Retention(RetentionPolicy.RUNTIME) 
@Target({ElementType.METHOD}) 
public @interface Cacheable {
 public CacheType value() default Cachetype.COMMON;
}

public enum CacheType {

 COMMON("common"),
 PERSISTENT("persistent";

 private String cache;

 CacheType(String cache) {
  this.cache = cache;
 }

 public String cache() {
  return this.cache;
 }
}
Était-ce utile?

La solution

Toujours présent dans JDK 6u25, mais l'ajout du package à la valeur par défaut fait l'affaire:

CacheType value() default com.io.CacheType.COMMON;

Autres conseils

Regardez ici: http://bugs.sun.com/view_bug.do?bug_id=6512707 cela pourrait être la cause de votre problème.

Donc, juste une petite mise à jour. Tandis que le traqueur de bogue montre le bogue comme étant fermé et semble vouloir réfuter toute nouvelle ouverture du bogue. Lorsque j'ai rencontré ce bogue dans cet exemple, il tourne autour du processeur d'annotation au moment de la compilation. Comme la rétention est RUNTIME, ce qui signifie qu’elle ne nécessite pas de processeur d’annotation lors de la compilation, il semble que le processeur d’annotation lors de la compilation fasse exploser le processus de compilation. Chaque fois que je suis dans NetBeans et que des annotations de temps de compilation sont activées sous Build- > en compilant dans les propriétés du projet, je reçois une série d'erreurs nébuleuses.

Je vais essayer d'ouvrir un nouveau ticket de bogue pour le problème et je viens de penser que je transmettrais la solution de contournement facile pour l'instant.

Toujours présent à l'aide de javac 1.6.0_26. La solution de contournement de yurez consistant à utiliser le nom de type qualifié complet lors de la spécification de la valeur par défaut fonctionne toujours.

Ce bogue a été résolu dans les versions 1.6.0_31 et 1.7.0_03 (peut-être aussi dans certaines versions précédentes), il suffit donc de mettre à niveau le compilateur java.

Je me demande si cela est dû à la définition de Cacheable et de CacheType dans le même fichier source, puis à l'importation de "com.io.CacheType". Cela pourrait éventuellement faire penser au compilateur qu’il existe deux classes appelées "com.io.CacheType".

Pourriez-vous publier le fichier source entier ou quelque chose d'autre? Le code que vous avez posté semble avoir été copié / collé à partir de différents fichiers source et regorge de fautes de frappe.

Normalement, ce qui suit devrait toujours faire l'affaire lorsque CacheType enum est dans un fichier source différent, vous aviez une faute de frappe dans CacheType.COMMON:

public @interface Cacheable {
 public CacheType value() default CacheType.COMMON;
}

Fonctionne avec un nom de type qualifié complet.

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

import com.io.CacheType;

@Retention(RetentionPolicy.RUNTIME) 
@Target({ElementType.METHOD}) 
public @interface Cacheable {
 public CacheType value() default com.io.Cachetype.COMMON;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top