每次尝试编译程序时,我都会收到此错误消息:
SeasonTest.java:24: incompatible types
found : java.lang.String
required: int
int date = ("" + mo + day);
^
1 error
我正在尝试连接两个整数以在字符串返回方法中形成另一个整数变量:
static String season (int month, int day)
{
int date = ("" + month + day);
String season;
if (date >= 316 && date <= 615)
{
season = "spring";
return season;
}
我玩过它,我无法理解问题究竟是什么。
答案 0 :(得分:1)
int date = ("" + month + day);
date
属于类型 int
,当您执行"" + month + day;
时,结果将是一个字符串。您无法将字符串分配给int
- 正如编译器错误明确指出的那样。
这就像写作:
int date = new StringBuilder("").append(month).append(day).toString();
导致编译错误。
答案 1 :(得分:1)
这个初始代码
int date = ("" + month + day); // Yields a string.
应该是这些方面的东西。
Calendar c = Calendar.getInstance(); // get a calendar instance.
int date = day;
for (int i = 0; i < month; i++) {
c.set(Calendar.MONTH, i); // set the month.
date += c.getActualMaximum(Calendar.DAY_OF_MONTH); //how many days are in that month?
}
答案 2 :(得分:1)
Java Language Specification对此有几点要说:
如果只有一个操作数表达式是String类型,则在另一个操作数上执行字符串转换(第5.1.11节)以在运行时生成字符串。
字符串连接的结果是对String对象的引用,该对象是两个操作数字符串的串联。左侧操作数的字符位于新创建的字符串中右侧操作数的字符之前。
除非表达式是编译时常量表达式(第15.28节),否则新创建String对象(第12.5节)。
外行人的说法:
在重载的String
运算符旁边找到的任何+
实例或文字将整个右手表达式转换为String
。
除非串联的结果会产生编译时错误,否则串联将成功。在这种情况下,它正在尝试将String
分配给int
- 这显然是非首发。
我的建议是简单地从表达式中删除空字符串。
关于你的实际节目的正确性:我把它作为练习留给你,但如果你只是决定季节,那么看看三个月的时间段。在北半球,12月20日(ish)到3月20日(ish)被认为是冬季。将其作为粗略指南来确定您的逻辑。
答案 3 :(得分:0)
当您向字符串追加任何内容时,表达式结果为字符串。因此,以下语句将产生一个字符串值:
("" + month + day)
并且您尝试将此值分配给int值,从而导致错误。你可能必须这样做:
int date = Integer.valueOf("" + month + day);
答案 4 :(得分:0)
您正在向两个整数添加“”,这将成为一个字符串。然后,您无法将该String分配给int。
以下是两种可能的解决方案:
int date = month + day;
int date = Integer.parseInt("" + month + day); // same as below solution
我认为你要做的就是把这一天与月份联系起来:
int date = (100 * month) + day;
答案 5 :(得分:0)
其他人给出了正确的答案。但是,让我补充一下:
在Java 7中使用Joda-Time 2.3,一些示例代码。
// © 2013 Basil Bourque. This source code may be used freely forever by anyone taking full responsibility for doing so.
// import org.joda.time.*;
int year = 2013; // Arbitrarily chosen year.
// Using day before, and day after, Spring to make the if() statement below simpler (no need to check OR EQUALS).
LocalDate springPre = new LocalDate( year, DateTimeConstants.MARCH, 16 ).minusDays( 1 );
LocalDate springPost = new LocalDate( year, DateTimeConstants.JUNE, 15 ).plusDays( 1 );
int month = 4; // Pair of arguments passed to your method.
int day = 22;
LocalDate localDate = new LocalDate( year, month, day );
Boolean isSpring;
if ( ( localDate.isAfter( springPre ) ) && ( localDate.isBefore( springPost ) ) ) {
isSpring = true;
} else {
isSpring = false;
}
System.out.println( "The date: " + localDate + " is in Spring: " + isSpring );
跑步时......
The date: 2013-04-22 is in Spring: true