gpt4 book ai didi

java - 如何在 Java 中传递函数时定义方法签名 - JUNIT with Hamcrest Fails

转载 作者:搜寻专家 更新时间:2023-10-30 23:02:58 25 4
gpt4 key购买 nike

我有以下功能:

private Person findMax(List<Person> persons,
Function<Person, ? extends Comparable> compare) {
return persons.stream().max(Comparator.comparing(compare)).get();
}

我可以称之为:

Person result = findMax(people, person -> person.getAge());

或者:

Person result = findMax(people, person -> person.getName());

只要 Person 的属性是 Comparable,这就有效,在这种情况下它适用于 Integer 和 String。但是,此模式会生成警告,这是错误代码的味道:

Comparable 是原始类型。对通用类型 Comparable 的引用应该被参数化

但是,我无法将比较器固定为任何东西,因为它取决于我作为参数传递的函数...

我试过这样修改方法:

private <T extends Comparable<T>> Person findMax(List<Person> persons,
Function<Person, T> compare) {
return persons.stream().max(Comparator.comparing(compare)).get();
}

现在,当我尝试使用 JUnit 和 Hamcrest 测试该函数时:

此行编译(使用旧的 JUnit 断言模式):

assertEquals(silvester, findMax(input, person -> person.getName()));

但是,这个不编译(类型不匹配:无法从 Integer 转换为 Comparable>):

assertThat(findMax(input, person -> person.getAge()), equalTo(arnold));

但是,如果我提取断言的第一个参数,它会构建得很好:

Person result = findMax(input, person -> person.getAge());
assertThat(result, equalTo(arnold));

这个符号也构建得很好:

assertThat(findMax(input, Person::getAge), equalTo(arnold));

这是 Hamcrest、Java8 或 Eclipse 中的错误吗?还是我遗漏了什么?

最佳答案

确保您的项目结构(对于 intellij 的 IDE)设置为允许 lambda 表达式。文件 > 项目结构 > 语法高级程度的下拉菜单。

关于java - 如何在 Java 中传递函数时定义方法签名 - JUNIT with Hamcrest Fails,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28898232/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com