在Java-JUNIT中用Hamcrest传递函数失败时如何定义方法签名

在Java-JUNIT中用Hamcrest传递函数失败时如何定义方法签名,java,generics,junit,lambda,hamcrest,Java,Generics,Junit,Lambda,Hamcrest,我有以下功能: private Person findMax(List<Person> persons, Function<Person, ? extends Comparable> compare) { return persons.stream().max(Comparator.comparing(compare)).get(); } 或: 只要Person的属性是可比较的,这就可以工作,在本例中适用于整数和字符串。但是,此模式会生成警告,这

我有以下功能:

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

只要Person的属性是可比较的,这就可以工作,在本例中适用于整数和字符串。但是,此模式会生成警告,这是错误代码的味道:


这是一种原始类型。对泛型类型Compariable的引用应参数化

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

我尝试过这样修改方法:

private <T extends Comparable<T>> Person findMax(List<Person> persons,
        Function<Person, T> compare) {
    return persons.stream().max(Comparator.comparing(compare)).get();
}
但是,此文件无法编译(类型不匹配:无法从整数转换为可比>):

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

Person result = findMax(input, person -> person.getAge());
assertThat(result, equalTo(arnold));
assertThat(findMax(input, 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中的bug吗?还是我遗漏了什么?

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

警告是什么?Comparable是原始类型。对泛型类型Compariable的引用应参数化。我对这个问题进行了更具体的编辑,但是代码可以直接粘贴到Java8IDE中versions@JavierMoll你在用什么IDE?我在EclipseLuna上得到了警告……我也在EclipseLuna、Java8、MacOS10.10.2上
Person result = findMax(input, person -> person.getAge());
assertThat(result, equalTo(arnold));
assertThat(findMax(input, Person::getAge), equalTo(arnold));