2017-10-14 4 views
0

Comment remplacer une méthode par un paramètre dynamique? Ou, est-ce que leur se déplacer pour des fonctionnalités similaires? Comme ceci:Comment surcharger par différents type dynamique dans java8?

class a{ 
    public ArrayList<Movie> getEntries(Function<Movie, Boolean> filter){ 

    } 
    public ArrayList<Ticket> getEntries(Function<Ticket, Boolean> filter){ 

    } 
} 

J'ai résolu ce problème en déclarant que getEntries:

public <T extends Model> ArrayList<T> getEntries(Predicate<T> filter) { } 

Et, laissez Film et étend Ticket modèle.

+1

Vous méthodes de surcharge lorsque différents catifs uniquement les types génériques –

+4

Vous ne pouvez pas. Il n'y a pas de surcharge pour les génériques. – GhostCat

+1

Qu'essayez-vous d'accomplir? Ce pourrait être un [problème XY] (https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). –

Répondre

3

Cela n'est pas possible parce que le compilateur Java supprime les informations génériques (type erasure) et que la classe aurait deux méthodes avec exactement la même signature de méthode.

Voir Oracle Tutorial

0

Comme autre écrit, en raison de l'effacement de type vous ne pouvez pas. Donnez un nom différent aux méthodes.

class A { 
    private List<Movie> movies = new ArrayList<>(); 
    private List<Ticket> tickets = new ArrayList<>(); 

    public List<Movie> getMovies(Predicate<Movie> filter) { 
     return movies.stream().filter(filter).collect(Collectors.toList()); 
    } 

    public List<Ticket> getTickets(Predicate<Ticket> filter) { 
     return tickets.stream().filter(filter).collect(Collectors.toList()); 
    } 
} 
2

Je suppose que vous voulez utiliser un Predicate plutôt qu'un Function pour ces derniers.

Vous pouvez écrire ce qui suit:

@FunctionalInterface interface MoviePredicate extends Predicate<Movie> { 
} 

@FunctionalInterface interface TicketPredicate extends Predicate<Ticket> { 
} 

Ensuite, votre code peut devenir:

class A { 
    public List<Movie> getEntries(MoviePredicate filter){ 
    } 
    public List<Ticket> getEntries(TicketPredicate filter){ 
    } 
}