2017-10-14 8 views
0

どのように動的型パラメータでメソッドをオーバーライドできますか?あるいは、類似した機能性を求めている人はいませんか?このよう :作品とチケットがモデルを拡張してみましょう、java8で異なる動的型でオーバーロードする方法は?

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

そして:

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

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

    } 
} 

私はまたgetEntriesを宣言することでこの問題を解決しました。

+1

あなたカントオーバーロードメソッド際 –

+4

あなたがすることはできません異なるだけで、一般的なタイプ。ジェネリックのオーバーロードはありません。 – GhostCat

+1

何を達成しようとしていますか?それは[XY問題](https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)かもしれません。 –

答えて

3

これは不可能です。Javaコンパイラが汎用情報(type erasure)を削除するため、これは完全に同じメソッドシグニチャを持つ2つのメソッドを持つクラスにつながります。他に書いたように

はできませんので消去を入力による、Oracle Tutorial

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()); 
    } 
} 
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){ 
    } 
} 
関連する問題