tipos incompatíveis encontrados: exigidas: enums padrão em anotações
-
07-07-2019 - |
Pergunta
[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;
Eu realmente não receber um presente. Eu tenho um projeto onde eu estou personalizado construção de um interceptor de cache para a Primavera. Ele simplesmente é um olhar pelo nome de cache para apontar para EhCache e usos aop-autoproxy para carregar o CacheableAspect (que é o meu cache intercepter). Agora, quando eu usar o valor padrão na anotação, ANT me dá o erro do compilador abaixo. Eu tentei atualizar para a última JDK (eu estou em 1.6 16 agora) e definir níveis de origem / destino no script ant, mas sem sucesso. Quando eu remover o valor padrão e forçar todas as áreas para especificar um valor, ele compila in fine formiga.
Ele sempre trabalhou em Eclipse, tive testes de unidade que correu perfeitamente com o valor padrão anterior.
O que dá? Tentei construir um projeto (sem molas) que simplesmente repetiu a configuração com formiga e compilado in fine formiga (e em eclipse).
que me diz que talvez ele poderia ser a mola de auto-proxy alguma forma? mas então por que o compilador não me dar o nome do tipo gerado? GRRRR. Quaisquer pensamentos?
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;
}
}
Solução
Ainda presente no JDK 6u25, mas a adição de pacote para o valor padrão faz o truque:
CacheType value() default com.io.CacheType.COMMON;
Outras dicas
Dê uma olhada aqui: http://bugs.sun.com/view_bug.do?bug_id=6512707 esta pode ser a causa do seu problema.
Então, basta um pouco de atualização. Enquanto o bug tracker mostra o bug como fechada e parece querer refutar quaisquer novas aberturas do bug. Quando eu encontrei este bug neste exemplo gira em torno do processador de anotação tempo de compilação. Desde a retenção é RUNTIME o que significa que não requer um processador de anotação tempo de compilação parece que a anotação processer tempo de compilação está fundindo-se o processo de compilação. Sempre que estou em NetBeans e eu tenho anotações do tempo de compilação ativada em Build-> Compilando nas propriedades projetos que eu receber uma série nebulosa de erros.
Eu estou indo para tentar abrir um novo ticket de bug para o problema e apenas pensei que eu iria passar a solução fácil para agora.
Ainda apresentar usando javac 1.6.0_26. solução de yurez de usar o nome de tipo totalmente qualificado ao especificar o valor padrão ainda funciona.
Encontrei este bug é resolvido em 1.6.0_31 e 1.7.0_03 (talvez também em algumas versões anteriores), então basta atualizar o compilador Java.
Gostaria de saber se isso é causado pela definição Cacheable e CacheType no mesmo arquivo de origem e, em seguida, importando "com.io.CacheType". Que poderiam vir a fazer o compilador acha que há duas classes chamados "com.io.CacheType".
Você poderia postar o arquivo de origem inteira ou algo assim? O código que você postou parece copiar / colar a partir de diferentes arquivos de origem e está cheio de erros.
Normalmente, o seguinte deve sempre fazer o truque quando CacheType enumeração está em um arquivo de origem diferente, você teve um erro de digitação no CacheType.COMMON:
public @interface Cacheable {
public CacheType value() default CacheType.COMMON;
}
Funciona com um nome de tipo totalmente qualificado.
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;
}