2013-08-16 33 views
0

我有以下枚举:为什么不将字节参数识别为整数?

public enum Months { 
    JAN(31), 
    FEB(28), 
    MAR(31), 
    APR(30), 
    MAY(31), 
    JUN(30), 
    JUL(31), 
    AUG(31), 
    SEP(30), 
    OCT(31), 
    NOV(30), 
    DEC(31); 

    private final byte DAYS; //days in the month 

    private Months(byte numberOfDays){ 
     this.DAYS = numberOfDays; 
    }//end constructor 

    public byte getDays(){ 
     return this.Days; 
    }//end method getDays 
}//end enum Months 

它给了我,说:“构造个月(INT)是未定义”虽然我通过一个有效字节的参数错误。 我在做什么错?

+1

您传入整数,但您的构造函数需要字节 – u6f6o

回答

9

最简单的办法就是接受int

private Months(int numberOfDays){ 
    this.DAYS = (byte) numberOfDays; 
} 

BTW非静态字段应该是camelCaseUPPER_CASE

而且FEB有些年份有29天。

public static boolean isLeapYear(int year) { 
    // assume Gregorian calendar for all time 
    return year % 4 == 0 && (year % 100 != 0 || year % 400 == 0); 
} 

public int getDays(int year) { 
    return days + (this == FEB && isLeapYear(year) ? 1 : 0); 
} 
+0

+1,29日。 – Thilo

+0

@Peter Lawrey我想过,但我只是想知道为什么不是作为一个参数传递的数字被认为是一个字节而不是int? – Kareem

+0

关于Feb在闰年中有29天是特殊情况,所以我正在通过Months.FEB.getDays()+ 1处理该问题。 – Kareem

7

这些数字是int文字。你不得不将它们转换成byte

JAN((byte)31), 
+0

请检查我在向Peter Lawrey发表的评论中请求的内容。 – Kareem

+1

好吧,编译器只是不这样做。它只看到一个'int'文字,而且看起来不会更远。 – Thilo

1

Java Language Specification说有关词法整数常量:

类型文字被确定为如下:

  • 类型字面的整数的(§3.10.1 )以L或l结尾很长(§4.2.1)。
  • 任何其他整数字面量的类型是int(§4.2.1)。

所以它需要你明确地将这个整数文字转换为字节。

相关问题