2015-07-29 36 views
5

błędu kompilacji interesująca Lambda Java 8 (Oracle JDK)Java 8 Lambda z funkcją <String, Object> jako argument

java -version 
java version "1.8.0_45" 
Java(TM) SE Runtime Environment (build 1.8.0_45-b14) 
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode) 

Mam wywołanie metody:

new CSVFile() 
.of(new FileInputStream("MyFile.csv")) 
.withColumnMapping("name", "fullName", s -> s.toUpperCase()) 
.withColumnMapping("gender", "gender", s -> s.toUpperCase()); 

Jest to metoda Próbuję zadzwonić:

public CSVFile withColumnMapping(final String columnName, final String beanPropertyName, final Function<String, Object> columnTransformFunction) { 
    columnMappings.add(new ColumnMapping(columnName, beanPropertyName, Optional.of(columnTransformFunction))); 
    return this; 
} 

Kompilacja błąd pojawia się:

[ERROR] /Users/sai/fun/reactivecsv/src/test/java/reactivecsv/CSVFileTest.java:[26,50] cannot find symbol 
[ERROR] symbol: method toUpperCase() 
[ERROR] location: variable s of type java.lang.Object 

Niesamowicie, to kompiluje

Function<String, Object> upperCaseConversion = String::toUpperCase; 
new CSVFile() 
.of(new FileInputStream("MyFile.csv")) 
.withColumnMapping("name", "fullName", upperCaseConversion) 
.withColumnMapping("gender", "gender", upperCaseConversion); 

Dlaczego kompilator nie jest w stanie syntetyzować lambda do funkcji?

+1

Jaką zmianę deklaruje się klasa 'CSVFile'? Czy to generyczne? –

+0

To jest poprawne: 'public class CSVFile ' – user1189332

+3

Z tego powodu 'nowy plik CSVFile()' jest typem nieprzetworzonym. –

Odpowiedz

8

Po utworzeniu new CSVFile() dla typu ogólnego, staje się typem nieprzetworzonym. Nie wolno używać typów surowych. Utworzenie go jako typu surowego powoduje również zmianę wszystkich metod na nieprzetworzone, dzięki czemu nie może wywnioskować typu argumentu lambda. Aby rozwiązać problem, podaj odpowiednie ogólne argumenty podczas wywoływania konstruktora.

+0

To jest rzeczywiście problem. – user1189332