A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 孙宇 黑马帝   /  2011-8-16 19:28  /  3280 人查看  /  12 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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

12 个回复

倒序浏览
黑马网友  发表于 2011-8-16 19:38:00
沙发
enum本来就是一个类,你现在是把一个类类型的东西又放到类里面,枚举比其它的类特殊。
回复 使用道具 举报
黑马网友  发表于 2011-8-16 19:38:49
藤椅
类里面放类 叫内部类
回复 使用道具 举报
黑马网友  发表于 2011-8-17 19:59:33
板凳
Colors colors();------------->报错,编译器无法感应Colors类的存在
这是一种错误的用法,当然会报错。你到底是要用来干什么呢?
回复 使用道具 举报
黑马网友  发表于 2011-8-17 20:05:44
报纸

回复 板凳 的帖子

这是java里面的注解,大括号里面的是注解的参数,参数的类型可以是类类型,可是我声明这个类类型编译器无法感应,
回复 使用道具 举报
楼主,你想在MyAnnotation里面调用Enum类型的对象myColors,但是你在上面的代码是
Colors colors();------------->报错,编译器无法感应Colors类的存在这是必然的,它找不到colors()这个方法呀。
[ 本帖最后由 范明正 于 2011-08-19  10:08 编辑 ]
回复 使用道具 举报
黑马网友  发表于 2011-8-19 13:10:29
7#
不是啊  Colors colors()这个是 我用Colors作为它的参数    colors()不要看他加括号就是方法,加()只是注解里面定义了这样的规则   

就像String value();
是把value这个字符串作为参数  并没有说String 里面value有这个方法
回复 使用道具 举报
黑马网友  发表于 2011-8-20 10:44:06
8#
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:57
9#

回复 8 # 的帖子

楼上的我有点晕了, 你说的8种支持类型 包括Class类型 ,又说不支持类类型?
那么Class类型不等于类类型吗?
回复 使用道具 举报
黑马网友  发表于 2011-8-20 11:28:38
10#

回复 9 # 的帖子

我目前的理解的是编译认识Class类型,而不认识自定义的Colors类型,就是如果想要把类作为注解的属性,需要以Class打头,水平有限,希望对注解有深入理解的大侠可以进来指点一下:)
回复 使用道具 举报
黑马网友  发表于 2011-8-20 11:57:09
11#
你想引用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:13
12#

回复 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:09
13#

回复 12 # 的帖子

起先我也遇到这个问题,最后这个[quote]EnumTest.TrafficLamp lamp() default EnumTest.TrafficLamp.RED; [/quote]放到最后一行就可以通过编译了,我想可能是IDE的问题,你试一下看看
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马