黑马程序员技术交流社区

标题: 注解将类类型作为参数,编译器为何报错? [打印本页]

作者: 孙宇    时间: 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