2015-03-06 11 views
6

Mam następującą funkcję:Jak zdefiniować Method podpis przy przejściu do funkcji w Javie - JUnit z Hamcrest zawodzi

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

mogę nazwać to robi:

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

czyli

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

Działa to tak długo, jak właściwość Osoba jest Porównywalna, co ma zastosowanie w tym przypadku dla liczby całkowitej i ciągu. Jednak ten schemat generuje ostrzeżenia, które są zapachem dla złego kodu:

Porównywalne jest typu surowego. Odniesienia do typu rodzajowego Porównywalna powinny być parametryzowane

Jednak nie mogę rozwiązać Komparator do niczego, ponieważ zależy od funkcji jestem przechodzącej jako parametr ...

Próbowałem modyfikując metodę tak:

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

teraz, gdy próbuję przetestować tę funkcję z JUnit i Hamcrest:

linia ta kompiluje (ze starym JUnit Assert wzorca):

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

Jednak ten nie kompiluje (niezgodność typów: nie można przekonwertować z Integer do porównywalnych>):

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

Ale jeśli wyodrębnić pierwszy parametr twierdzeniu, buduje także:

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

Ten zapis buduje również dobrze:

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

jest to błąd w Hamcrest, Java8 o r Eclipse? Czy może czegoś brakuje?

+1

Co to jest ostrzeżenie? –

+0

Porównywalny to typ surowy. Należy sparametryzować odniesienia do rodzaju ogólnego Porównywalne . Zmieniłem to pytanie, aby było bardziej szczegółowe, ale kod można bezpośrednio wkleić w IDE java8. – Martin

+0

Nie otrzymuję żadnego ostrzeżenia w obu wersjach: –

Odpowiedz

0

Upewnij się, że twoja struktura projektu (dla IDE intellijskiego) jest ustawiona tak, aby zezwalać na wyrażenia lambda. Plik> struktura projektu> rozwijane menu określające zaawansowanie składni.

Powiązane problemy