当通过泛型参数传递时,过滤器将失去对内部对象方法的访问权限

Nat*_*H06 1 java generics lambda filter java-8

我在一个方法中有一个并行流,当我以这种方式运行时,它工作正常:

Meeting是一个接口,其实现具有private int id成员字段和一个getter方法getId();

public class MyClass {
   private List<Meeting> myMeetings = new ArrayList<>();

   public PastMeeting getPastMeeting (int id){
            Meeting meetingWithId;
            meetingWithId = myMeetings.parallelStream()
                    .filter(meeting -> meeting.getId() == id )
                    .findFirst()
                    .get();
            return meetingWithId;
        }
}
Run Code Online (Sandbox Code Playgroud)

但是,我将不得不从myClass中的其他几个方法执行此操作,因此我需要将该操作设置为自己的方法,并且我已将下面的方法添加到myClass,因为我可能有不同的Meeting实现,因此不同列表的类型也是如此,因此我将参数设置为通用.但是,当我以这种方式运行时,过滤器无法访问Meeting的getId()方法,称它"无法解析m.getId();"

private <T, R> T returnMeeting(T meeting, List<R> meetingList, int id) {        
        meeting = meetingList.parallelStream()
                .filter(m -> m.getId() == id )
                .findFirst()
                .get();
        return meeting;
}
Run Code Online (Sandbox Code Playgroud)

我不确定为什么,因为代码完全一样.运行泛型参数字段是否会导致lambda可以假设的中断?谢谢.

k5_*_*k5_ 5

由于您没有为通用参数添加类型边界,因此您只能Object使用可用的方法.

您有两种选择:

添加一个类型绑定,强制执行具有您要使用的方法的特定类型/接口.

interface IdProvider {
   int getId();
}

private <T extends IdProvider> T returnMeeting(List<T> meetingList, int id)    {        
    return meetingList.parallelStream()
            .filter(m -> m.getId() == id )
            .findFirst()
            .get();
}
Run Code Online (Sandbox Code Playgroud)

或者在方法中添加另一个参数,用于定义如何解析id

private <T> T returnMeeting(List<T> meetingList, int id, Function<T,Integer> idGetter) {        
    return meetingList.parallelStream()
            .filter(m -> idGetter.apply(m).equals(id) )
            .findFirst()
            .get();
}
Run Code Online (Sandbox Code Playgroud)