如何在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) { }
而且,让电影和票务扩展模型。
答
至于其他写道,由于类型擦除你不能。给这些方法一个不同的名字。
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){
}
}
你不能超载方法时只不同的泛型类型 –
你不能。泛型没有超载。 – GhostCat
你想达到什么目的?这可能是[XY问题](https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。 –