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

时间:2017-10-14 16:47:39

标签: java generics functional-programming java-8

如何通过动态类型参数覆盖方法?或者,他们是否有任何类似的功能? 像这样:

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) { }

并且,让电影和票证扩展模型。

3 个答案:

答案 0 :(得分:3)

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

请参阅Oracle Tutorial

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