如何通过动态类型参数覆盖方法?或者,他们是否有任何类似的功能? 像这样:
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) { }
并且,让电影和票证扩展模型。
答案 0 :(得分:3)
这是不可能的,因为Java编译器会删除通用信息(type erasure),这会导致类有两个方法具有完全相同的方法签名。
答案 1 :(得分:2)
我认为您希望使用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){
}
}
答案 2 :(得分:0)
正如其他人写道,由于类型擦除,你不能。给方法一个不同的名称。
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());
}
}