如何在java8中通过不同的动态类型重载?

问题描述:

我怎样才能重写一个动态类型参数的方法?或者,他们是否有类似的功能? 像这样:如何在java8中通过不同的动态类型重载?

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

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

    } 
} 

我已经通过声明getEntries解决了这个问题,因为:

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

而且,让电影和票务扩展模型。

+1

你不能超载方法时只不同的泛型类型 –

+4

你不能。泛型没有超载。 – GhostCat

+1

你想达到什么目的?这可能是[XY问题](https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。 –

这是不可能的,因为Java编译器删除通用信息(type erasure),这将导致类有两个方法具有完全相同的方法签名。

Oracle Tutorial

至于其他写道,由于类型擦除你不能。给这些方法一个不同的名字。

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

我假设你想使用一个Predicate,而不是它们的Function

你可以写:

@FunctionalInterface interface MoviePredicate extends Predicate<Movie> { 
} 

@FunctionalInterface interface TicketPredicate extends Predicate<Ticket> { 
} 

然后你的代码可以成为:

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