2015-03-06 5 views
6

Ich habe die folgende Funktion:Wie Methode Signatur zu definieren, wenn eine Funktion in Java vorbei - JUNIT mit hamcrest schlägt

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

Oder:

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

ich es zu tun nennen

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

Dies funktioniert, solange die Eigenschaft von Person ein Comparable ist, das in diesem Fall für Integer und String gilt. Dieses Schema generiert jedoch Warnungen, die für schlechten Code riecht:

Vergleichbar ist ein roher Typ. Verweise auf generische Art Vergleichbare sollte

jedoch parametriert werden, kann ich nicht den Vergleicher auf alles reparieren, wie es auf der Funktion abhängig ich als Parameter bin vorbei ...

Ich versuchte, die Methode wie folgt ändern:

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

Nun, wenn ich versuche, diese Funktion mit JUnit zu testen und hamcrest:

Diese Zeile kompiliert (mit den alten JUnit Assert Mustern):

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

Allerdings ist dieses nicht (Typenkonflikt: kann nicht von Integer zu Vergleichbare konvertieren>): kompilieren

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

Aber, wenn ich den ersten Parameter der Behauptung zu extrahieren, es baut auch:

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

diese Notation baut auch gut:

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

Ist das ein Fehler in hamcrest, Java8 o Eklipse? Oder fehlt mir etwas?

+1

Was ist die Warnung? –

+0

Vergleichbar ist ein roher Typ. Verweise auf den generischen Typ Comparable sollten parametrisiert werden. Ich habe die Frage genauer bearbeitet, aber der Code kann direkt in eine java8 IDE eingefügt werden. – Martin

+0

Ich bekomme keine Warnung mit beiden Versionen –

Antwort

0

Stellen Sie sicher, dass Ihre Projektstruktur (für Intellijs IDE) auf Lambda-Ausdrücke eingestellt ist. Datei> Projektstruktur> Drop-Down-Menü für wie fortgeschritten die Syntax sein kann.

Verwandte Themen