如何在java中的接口中使泛型参数可选?

时间:2017-06-30 15:39:20

标签: java generics interface

我有一个有2个通用参数的接口。但有时需要抽象方法只接受1个通用参数。我怎样才能做到这一点?我看到它的方式我不能使泛型可选,如果我在界面内编写一个重载方法,它将在一些不需要的java类(将实现该接口)中不必要地实现。现在我传递参数化,在实现接口时也在类头中需要两次,并且在函数内部,因为我强制性地必须传递2个参数。我被卡住了。任何方向?

public interface ITaskPermissionHandler<T, V> {

    String getType();

    boolean hasPermission(T clazz, UserRef user, String type, V clazz1);
}

public class CreateTaskPermission implements ITaskPermissionHandler<Task,Task> {

    @Override
    public String getType() {
        return TaskConstants.CREATE_TASK;
    }

    @Override
    public boolean hasPermission(Task task, UserRef user, String type, Task      task1) {
        return type.equalsIgnoreCase(TaskConstants.CREATE_TASK);
    }
}

1 个答案:

答案 0 :(得分:2)

您的方法需要4个参数。你不能突然让它花费3。

如果你想要一个带有3个参数的方法,那么它是一个不同的方法(重载),你需要一个与该方法不同的接口。

然而,您可以执行java.util.function接口的操作,并使用更简单的版本扩展界面,例如BinaryOperator<T>扩展BiFunction<T,T,T>的方式。

像其中一种方式:

interface ISimplePermissionHandler<T> extends ITaskPermissionHandler<T, T> {
    default boolean hasPermission(T clazz, UserRef user, String type) {
        return hasPermission(clazz, user, type, clazz);
    }
}   
class CreateTaskPermission implements ISimplePermissionHandler<Task> {
    @Override
    public String getType() {
        return TaskConstants.CREATE_TASK;
    }
    @Override
    public boolean hasPermission(Task task, UserRef user, String type, Task task1) {
        return type.equalsIgnoreCase(TaskConstants.CREATE_TASK);
    }
}
interface ISimplePermissionHandler<T> extends ITaskPermissionHandler<T, T> {
    @Override
    default boolean hasPermission(T clazz, UserRef user, String type, T clazz1) {
        return hasPermission(clazz, user, type);
    }
    boolean hasPermission(T clazz, UserRef user, String type);
}   
class CreateTaskPermission implements ISimplePermissionHandler<Task> {
    @Override
    public String getType() {
        return TaskConstants.CREATE_TASK;
    }
    @Override
    public boolean hasPermission(Task task, UserRef user, String type) {
        return type.equalsIgnoreCase(TaskConstants.CREATE_TASK);
    }
}