2015-07-29 6 views
5

errore di compilazione interessante in Lambda Java 8 (Oracle JDK)Java 8 Lambda con funzione <String, Object> come argomento

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) 

ho una chiamata di metodo:

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

Questo è il metodo sto cercando di chiamare:

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; 
} 

Errore di compilazione che ottengo è:

[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 

Stranamente, questo compila

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

Perché il compilatore non è in grado di sintetizzare la lambda in una funzione?

+1

Con qualsiasi modifica viene dichiarata la classe 'CSVFile'? È generico? –

+0

Ciò è corretto: 'classe pubblica CSVFile ' – user1189332

+3

Quindi 'nuovo CSVFile()' è un tipo non elaborato. –

risposta

8

Quando si crea new CSVFile() per tipo generico, diventa un tipo non elaborato. Non devi usare i tipi non elaborati. Creandolo come tipo non elaborato cambia anche tutti i suoi metodi in raw, quindi withColumnMapping(String, String, Function<String, Object>) diventa withColumnMapping(String, String, Function) e il tipo del tuo argomento lambda non può essere dedotto. Per risolvere il tuo problema, specifica gli argomenti generici appropriati quando chiami il costruttore.

+0

Questo è davvero il problema. – user1189332