Se você simplesmente não precisa de nada como seu tipo, pode usar void. Isso pode ser usado para implementar funções ou ações. Você poderia então fazer algo assim:
interface Action<T> {
public T execute();
}
abstract class VoidAction implements Action<Void> {
public Void execute() {
executeInternal();
return null;
}
abstract void executeInternal();
}
Ou você pode omitir a classe abstrata e retornar null em todas as ações que não exigem um valor de retorno.
Você pode então usar essas ações como esta:
Dado um método
private static <T> T executeAction(Action<T> action) {
return action.execute();
}
você pode chamá-lo assim
String result = executeAction(new Action<String>() {
@Override
public String execute() {
//code here
return "Return me!";
}
});
ou, para a ação anular (observe que você não está atribuindo o resultado a nada)
executeAction(new VoidAction() {
@Override
public void executeInternal() {
//code here
}
});