Lambda表达式返回类型错误:void无法转换为int问题求助
解决Lambda表达式返回类型不匹配的问题
嘿,我来帮你搞定这个报错!你遇到的bad return type in lambda expressions void cannot be converted to int错误,根源其实很明确:
你的LeapYears接口里定义的leapYear方法要求返回int类型,但你在Lambda表达式里写的return System.out.println(...),而System.out.println()本身是个void方法(没有返回值),这就导致编译器找不到可以转换成int的返回值,直接报错了。
另外你的代码还有个小问题:把用户输入的逻辑放在了Lambda里,这样Lambda就同时承担了“获取输入”和“判断闰年”两个职责,有点违背单一职责原则,也不利于代码复用。
下面给你修正后的代码,我调整了几个关键点:
import java.util.Scanner; // 调整接口方法:返回boolean更符合判断闰年的逻辑,方法名也更直观 interface LeapYears { boolean isLeapYear(int year); } public class LeapYear { public static void main(String[] args) { Scanner in = new Scanner(System.in); // 把输入逻辑移到main方法里,和判断逻辑分离 System.out.print("Year between 2012 and 2060: "); int inputYear = in.nextInt(); // Lambda只专注于判断闰年的核心逻辑,返回boolean类型,和接口方法匹配 LeapYears leapChecker = (yearToCheck) -> { boolean divisibleBy4 = yearToCheck % 4 == 0; boolean notDivisibleBy100 = yearToCheck % 100 != 0; boolean divisibleBy400 = yearToCheck % 400 == 0; return (divisibleBy4 && notDivisibleBy100) || divisibleBy400; }; // 根据Lambda的判断结果输出信息 if (leapChecker.isLeapYear(inputYear)) { System.out.println(inputYear + " is a leap year"); } else { System.out.println(inputYear + " is not a leap year"); } in.close(); // 记得关闭Scanner资源 } }
如果坚持要让接口返回int(比如用1表示闰年,0表示非闰年),也可以这样修改Lambda部分:
// 保持接口原定义 interface LeapYears { int leapYear(int years); } // Lambda部分改成: LeapYears leapChecker = (yearToCheck) -> { boolean divisibleBy4 = yearToCheck % 4 == 0; boolean notDivisibleBy100 = yearToCheck % 100 != 0; boolean divisibleBy400 = yearToCheck % 400 == 0; boolean isLeap = (divisibleBy4 && notDivisibleBy100) || divisibleBy400; // 返回1或0,匹配int类型的要求 return isLeap ? 1 : 0; }; // 然后main里根据返回值判断: int result = leapChecker.leapYear(inputYear); if (result == 1) { System.out.println(inputYear + " is a leap year"); } else { System.out.println(inputYear + " is not a leap year"); }
核心记住:Lambda表达式的返回值类型必须和接口中抽象方法的返回类型完全一致,不能用void去匹配int这种数值类型哦~
内容的提问来源于stack exchange,提问作者Skogenlol
相关产品推荐
相关产品推荐

