2017-10-14 3 views
0

어떻게 동적 유형의 매개 변수로 메소드를 대체 할 수 있습니까? 아니면, 비슷한 기능을 위해 주위를 돌아 다니고 있습니까? 이처럼 는 :java8에서 다른 동적 유형으로 오버로드하는 방법은 무엇입니까?

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

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

    } 
} 

I는 다음과 같이 선언 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). –

답변

3

Java 컴파일러가 제네릭 정보 (type erasure)를 제거하고 이로 인해 동일한 메소드 서명이있는 두 개의 메소드가있는 클래스가 생성 될 수 있기 때문에 불가능합니다. 다른 썼던 것처럼

당신이 할 수없는 삭제를 입력하기 때문에, 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){ 
    } 
} 
관련 문제