【问题标题】:incompatible types found: required: default enums in annotations发现不兼容的类型:必需:注释中的默认枚举
【发布时间】:2010-11-28 08:19:17
【问题描述】:
[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;

我真的不明白这个。 我有一个项目,我正在为 Spring 自定义构建缓存拦截器。它只是通过缓存名称查看指向 EhCache 并使用 aop-autoproxy 加载 CacheableAspect(这是我的缓存拦截器)。现在,当我在注释中使用默认值时,ANT 给出了下面的编译器错误。我尝试更新到最新的 JDK(我现在使用 1.6 16)并在 ant 脚本中设置源/目标级别,但没有成功。当我删除默认值并强制所有区域指定一个值时,它会在 ant 中正常编译。

它总是在 Eclipse 中工作,我的单元测试使用以前的默认值完美运行。

什么给了?我尝试构建一个项目(没有弹簧),它简单地用 ant 呼应配置,并在 ant 中编译(和在 eclipse 中)。

这告诉我可能是 Spring 自动代理?但是为什么编译器不给我生成的类型名称呢? GRRRR。有什么想法吗?

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;
 }
}

【问题讨论】:

    标签: java spring ant annotations aop


    【解决方案1】:

    JDK 6u25 中仍然存在,但将包添加到默认值就可以了:

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

    【讨论】:

    • 在 JDK 1.6.0_31 或 1.7.0_03 中已修复此错误(请参阅下面的答案)
    • 堆栈溢出,我爱你。你也是@yurez。
    【解决方案2】:

    看看这里: http://bugs.sun.com/view_bug.do?bug_id=6512707 这可能是您的问题的原因。

    【讨论】:

    • 最新的 Sun JDK (6u20) 仍然存在这个错误。使用 OpenJDK 或 JDT(eclipse 的一部分)进行编译为我解决了这个问题。 JDT 可以在 Eclipse 之外使用(例如在 ant 中)详细信息在这里:help.eclipse.org/ganymede/index.jsp?topic=/…。要使用可插入注释处理器,您需要 org.eclipse.jdt.apt.pluggable.core.jar 和 org.eclipse.jdt.compiler.apt.jar 在您的类路径中,这些可以在插件中找到eclipse安装文件夹。
    【解决方案3】:

    所以只是一点点更新。虽然错误跟踪器将错误显示为已关闭,并且似乎想要反驳任何新的错误开口。当我在这个例子中遇到这个错误时,它围绕着编译时注释处理器。由于保留是 RUNTIME 这意味着它不需要编译时注释处理器,因此编译时注释处理器似乎正在破坏编译过程。每当我在 NetBeans 中并且在项目属性中的 Build->Compiling 下启用了编译时注释时,我都会收到一系列模糊不清的错误。

    我将尝试为该问题开一个新的错误票,只是想我现在会传递简单的解决方法。

    【讨论】:

    【解决方案4】:

    仍然使用 javac 1.6.0_26。 yurez 在指定默认值时使用完全限定类型名称的解决方法仍然有效。

    【讨论】:

      【解决方案5】:

      发现这个bug在1.6.0_31和1.7.0_03(以前的一些版本也可能也解决了),所以升级java编译器就好了。

      【讨论】:

      • 只是编译器的错误还是 JRE 的错误?关键是,如果我在 1.6.0u31 中编译它是否可以在旧版本的 JRE 1.6 中工作。
      • @Gaim 这是一个编译器错误,而不是 JRE 错误,所以请猜测一下。
      【解决方案6】:

      不知道是不是因为在同一个源文件中定义了Cacheable和CacheType,然后导入了“com.io.CacheType”。这可能会让编译器认为有两个名为“com.io.CacheType”的类。

      【讨论】:

        【解决方案7】:

        你能发布整个源文件吗?您发布的代码似乎是从不同的源文件复制/粘贴的,并且充满了拼写错误。

        通常,当 CacheType 枚举位于不同的源文件中时,以下内容应该总是可以解决问题,您在 CacheType.COMMON 中有错字:

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

        【讨论】:

        • 它在不同的源文件中,你是对的,看起来我有错字。因为我现在在工作,所以我回家后会发布它。
        【解决方案8】:

        使用完全限定的类型名称。

        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;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-03-08
          • 1970-01-01
          • 1970-01-01
          • 2021-02-23
          • 1970-01-01
          • 2011-10-27
          • 2020-11-29
          • 1970-01-01
          相关资源
          最近更新 更多