找到不兼容的类型:必需:注释中的默认枚举
-
07-07-2019 - |
题
[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 fine(和eclipse)中编译。
告诉我可能它可能是春天的自动代理吗?但那么为什么编译器不会给我生成的类型名称? 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;
}
}
解决方案
仍然存在于JDK 6u25中,但是将软件包添加到默认值就可以了:
CacheType value() default com.io.CacheType.COMMON;
其他提示
看看这里: http://bugs.sun.com/view_bug.do?bug_id=6512707 这可能是你问题的原因。
所以只需要一点点更新。虽然bug跟踪器显示bug已关闭,但似乎想要反驳bug的任何新开口。当我在这个例子中遇到这个错误时,围绕编译时注释处理器。由于保留是RUNTIME,这意味着它不需要编译时注释处理器,看起来编译时注释处理器正在炸毁编译过程。每当我在NetBeans中并且我在Build->在项目属性中编译时启用了编译时注释时,我会收到一系列错误的错误。
我打算尝试为这个问题打开一个新的错误机票,我想我现在就会传递一个简单的解决方法。
仍然使用javac 1.6.0_26。 yurez在指定默认值时使用完全限定类型名称的解决方法仍然有效。
发现此错误已在1.6.0_31和1.7.0_03中解决(可能也在某些先前版本中),因此只需升级java编译器。
我想知道这是否是由于在同一源文件中定义Cacheable和CacheType,然后导入“com.io.CacheType”引起的。可以想象,编译器认为有两个类叫做“com.io.CacheType”。
你能发布整个源文件吗?您发布的代码似乎是从不同的源文件中复制/粘贴的,并且充满了拼写错误。
通常情况下,当CacheType枚举位于不同的源文件中时,下面应该总是这样做,你在CacheType.COMMON中输入错误:
public @interface Cacheable {
public CacheType value() default CacheType.COMMON;
}
使用完全限定的类型名称。
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;
}