2015-06-13 22 views
7

Ho la seguente classe diJava 8: Lambda Funzione e generici jolly

class Book implement Borrowable { 
    @Override 
    public String toString(Function<? extends Borrowable 
          , String> format) { 
      return format.apply(this);  
    } 
} 

Questo mi dà un errore che non posso usare "applicare" in questa (oggetto Book).

mio formattatore corrente è

Function<Book, String> REGULAR_FORMAT = book -> "name='" + book.name + '\'' + 
     ", author='" + book.author + '\'' + 
     ", year=" + book.year; 

Io non voglio fare la funzione lambda del tipo

Function<Borrowable, String> 

come avrei perso l'accesso ai membri del Libro non esposto da Mutuabile.

risposta

7

Il tipo Function<? extends Borrowable, String> indica la funzione che è in grado di accettare del tipo che si estende Borrowable. Ciò non significa che accetta Book. Probabilmente la soluzione migliore è quello di introdurre il parametro generico per Borrowable:

public interface Borrowable<T> { 
    public String toString(Function<? super T, String> format); 
} 

e specificare in Book:

public class Book implements Borrowable<Book> { 
    @Override 
    public String toString(Function<? super Book, String> format) { 
     return format.apply(this); 
    } 
} 

E 'simile a come funziona l'interfaccia i Comparable.

+0

Ha funzionato. Anche se non capisco come la tua soluzione. Un link o un po 'più di approfondimenti sarebbe di grande aiuto – AbrahamDaniel

2

Si potrebbe cercare .

A Function<Book, String> è un Function<? extends Borrowable, String> valido, ma lo è anche Function<DVD, String>. Il tuo metodo (toString) potrebbe essere chiamato con un Function<DVD, String>, che non è possibile passare a this perché this non è un DVD!

Modificare il tipo di argomento su Function<? super Book, String>, forse.

+0

nota che è sovrascritto, quindi è effettivamente definito nell'interfaccia' Finanziabile '. –

+0

@TagirValeev Dovrebbe funzionare, dal momento che 'Funzione 'è un sottotipo di' Funzione '(e sì, l'ho capito nel modo giusto, penso) – immibis

+1

Non funziona. Non è possibile sovrascrivere il metodo nel sottotipo specificando diversi tipi di argomenti anche se sono compatibili. È possibile restringere solo il tipo restituito e le eccezioni dichiarate. –