如何为同一方法传递不同的对象类型,而不是在java中编写两个具有相同功能和返回类型的方法

bbuxkriu  于 2021-07-08  发布在  Java
关注(0)|答案(1)|浏览(504)

这里是我的方法,我想使它成为动态的,应该接受类类型作为参数,然后我可以在我的 predicate 中使用它,我已经尝试使用instanceof,但没有工作

public static String setStatus(List<SmeObject> s) {
    String finalStatus = "";
    Predicate<SmeObject> ifAllCompleted = x.getStatus().equals("Completed");
    Predicate<SmeObject> ifAllNotStarted = x.getStatus().equals("Not Started");

    if (s.stream().allMatch(ifAllCompleted)) {
        finalStatus = "Complete";
    } else if (s.stream().allMatch(ifAllNotStarted)) {
        finalStatus = "Not Started";
    } else {
        finalStatus = "In-progress";
    }
    return finalStatus;
}

public static String setStatus(List<ControllerObject> s) {
    String finalStatus = "";
    Predicate<ControllerObject> ifAllCompleted = x.getStatus().equals("Completed");
    Predicate<ControllerObject> ifAllNotStarted = x.getStatus().equals("Not Started");

    if (s.stream().allMatch(ifAllCompleted)) {
        finalStatus = "Complete";
    } else if (s.stream().allMatch(ifAllNotStarted)) {
        finalStatus = "Not Started";
    } else {
        finalStatus = "In-progress";
    }
    return finalStatus;
}
vptzau2j

vptzau2j1#

如果 ControllerObject 以及 SmeObject 共享一个公开 getStatus() 方法,则您可能希望使您的方法采用带有 List<? extends CommonObjectSuperType> :

public static String setStatus(List<? extends CommonObjectSuperType> s) {
    String finalStatus = "";
    Predicate<CommonObjectSuperType> ifAllCompleted = x.getStatus().equals("Completed");
    Predicate<CommonObjectSuperType> ifAllNotStarted = x.getStatus().equals("Not Started");

    ...
}

但是,如果, ControllerObject 以及 SmeObject 没有公开的公共父级 getStatus() 如果您不能更改它们,那么您可以选择通过使方法泛型来使调用方发送 predicate :

public static <T> String setStatus(List<T> s, Predicate<T> allCompletedTest,
        Predicate<T> allNotStartedTest) {
    //use incoming predicates instead of creating them in the method
    ...
}

然后调用方将在实际类型的上下文中创建 predicate 。

相关问题