黑马程序员技术交流社区
标题:
注解将类类型作为参数,编译器为何报错?
[打印本页]
作者:
孙宇
时间:
2011-8-16 19:28
标题:
注解将类类型作为参数,编译器为何报错?
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE,ElementType.METHOD,ElementType.ANNOTATION_TYPE})
public @interface MyAnnotation {
String color() default "red";
String value();
int[]arrayAtrr() default{1,2,3};
Colors colors();------------->报错,编译器无法感应Colors类的存在
}
编译器无法感应Colors类的存在,这是什么原因导致的?
以下是Colors类的内容
public class Colors {
public enum myColors{
RED,BLUE,GREEN;
}
}
作者:
匿名
时间:
2011-8-16 19:38
enum本来就是一个类,你现在是把一个类类型的东西又放到类里面,枚举比其它的类特殊。
作者:
匿名
时间:
2011-8-16 19:38
类里面放类 叫内部类
作者:
匿名
时间:
2011-8-17 19:59
Colors colors();------------->报错,编译器无法感应Colors类的存在
这是一种错误的用法,当然会报错。你到底是要用来干什么呢?
作者:
匿名
时间:
2011-8-17 20:05
标题:
回复 板凳 的帖子
这是java里面的注解,大括号里面的是注解的参数,参数的类型可以是类类型,可是我声明这个类类型编译器无法感应,
作者:
范明正
时间:
2011-8-19 10:07
楼主,你想在MyAnnotation里面调用Enum类型的对象
myColors
,但是你在上面的代码是
Colors colors();------------->报错,编译器无法感应Colors类的存在这是必然的,它找不到colors()这个方法呀。
[
本帖最后由 范明正 于 2011-08-19 10:08 编辑
]
作者:
匿名
时间:
2011-8-19 13:10
不是啊 Colors colors()这个是 我用Colors作为它的参数 colors()不要看他加括号就是方法,加()只是注解里面定义了这样的规则
就像String value();
是把value这个字符串作为参数 并没有说String 里面value有这个方法
作者:
匿名
时间:
2011-8-20 10:44
Invalid type Colors for the annotation attribute ItcastAnnotation.colors;[color=red] [i][b]only primitive type, String, Class, annotation, enumeration are permitted or 1-dimensional arrays thereof[/b][/i][/color]
这是编译所报的错误,意思是说注解的类型只支持8种基本数据类型,String类型,Class类型,注解类型,枚举类型以及以上几种类型的数组类型(一维的),你的代码中[quote]Colors colors();------------->报错,编译器无法感应Colors类的存在[/quote]这句的类型是类类型,不属于以上范畴,所以编译才会报错
如果想把Colors类作为属性的话,这样写才是正确的
[code=java]Class Colors() default Colors.class;[/code]
它返回的是一个Class类型
不过我想你应该是想访问Colors类中的myColors枚举类,代码可以这样写
[code=java]
Colors.myColors colors();
[/code]
这样返回的才是一个枚举类型
作者:
匿名
时间:
2011-8-20 10:57
标题:
回复 8 # 的帖子
楼上的我有点晕了, 你说的8种支持类型 包括Class类型 ,又说不支持类类型?
那么Class类型不等于类类型吗?
作者:
匿名
时间:
2011-8-20 11:28
标题:
回复 9 # 的帖子
我目前的理解的是编译认识Class类型,而不认识自定义的Colors类型,就是如果想要把类作为注解的属性,需要以Class打头,水平有限,希望对注解有深入理解的大侠可以进来指点一下:)
作者:
匿名
时间:
2011-8-20 11:57
你想引用Colors colors(); 你必须把你的Colors 定义成一个注解不能是一个类,类肯定编译通过不了的。
@Retention(RetentionPolicy.RUNTIME)
@Target( { ElementType.TYPE, ElementType.METHOD })
// 注解放在哪个地方
public @interface MyAnnotation {
String color() default "blue";
String value();
int[] arrayAttr() default { 4, 5, 5 };
EnumTest.TrafficLamp lamp() default EnumTest.TrafficLamp.RED;
Colors colors();
}
public @interface Colors{
String value();
public enum myColors {
RED, BLUE, GREEN;
}
}
作者:
匿名
时间:
2011-8-20 12:32
标题:
回复 11 # 的帖子
这个是老师的源码
public class EnumTest {
public enum TrafficLamp{
RED(30){
public TrafficLamp nextLamp(){
return GREEN;
}
},
GREEN(45){
public TrafficLamp nextLamp(){
return YELLOW;
}
},
YELLOW(5){
public TrafficLamp nextLamp(){
return RED;
}
};
public abstract TrafficLamp nextLamp();
private int time;
private TrafficLamp(int time){this.time = time;}
}
}
----
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.TYPE})
public @interface ItcastAnnotation {
String color() default "blue";
String value();
int[] arrayAttr() default {3,4,4};
EnumTest.TrafficLamp lamp() default EnumTest.TrafficLamp.RED;
MetaAnnotation annotationAttr() default @MetaAnnotation("lhm");
}
按你的说法老师这个应该也编译不通过才对,可是这份运行确是成功了 我只是模仿的写了一份 就是报错了 不懂问题在哪
作者:
匿名
时间:
2011-8-20 12:47
标题:
回复 12 # 的帖子
起先我也遇到这个问题,最后这个[quote]EnumTest.TrafficLamp lamp() default EnumTest.TrafficLamp.RED; [/quote]放到最后一行就可以通过编译了,我想可能是IDE的问题,你试一下看看
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2