2017-06-30 64 views
0

我有一個有2個泛型參數的接口,但有時需要抽象方法來接受1個泛型參數。我該如何做到這一點?我看到它的方式,我不能使泛型可選,而且如果我在接口中編寫一個重載的方法,它將不必要地實現在一些Java類(這將實現該接口)不必要的地方。現在我傳遞參數化,這是需要兩次在類頭中實現接口和內部函數,因爲我強制必須傳遞2個參數。我卡住了。任何方向?如何在java中的接口中使通用參數可選?

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); 
    } 
} 
+4

它看起來並不像那些仿製藥正在贏得你什麼,反正。你爲什麼擁有它們?直到我真正瞭解你想要完成的事情之前,我都猶豫不決。 – Makoto

+0

我在這裏看不到問題。這是一個常用的方法。只要看看一個帶有'String'的'Map'作爲鍵和值。然後你會寫'Map '。 – QBrute

+3

@QBrute:是的,但那些實際上映射到有意義的東西。 OP的代碼甚至不會在任何地方使用這些泛型*。 – Makoto

回答

1

您的方法需要4個參數。你不可能突然想到它3.

如果你想要一個帶3個參數的方法,那麼它是一個不同的方法(過載),並且你需要一個與該方法不同的接口。

然而,您可以做接口所做的工作,並使用更簡單的版本擴展接口,如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); 
    } 
} 
+0

您的代碼將ITaskPermissionHandler (OP的代碼)更改爲ITaskPermissionHandler (您的代碼)...這是故意的嗎? – deckeresq

+0

@deckeresq我沒有*改變*'ITaskPermissionHandler'。我*使用*它,完全按照問題中的定義。 – Andreas

+0

啊,對不起,看來我誤解了你的代碼。感謝您的澄清! – deckeresq