2014-09-07 5 views
1

Я использую шаблон команды для инкапсуляции логики в «командные» объекты. Я в настоящее время есть два типа командных интерфейсов:Объединение различных типов командных интерфейсов с использованием generics/inheritance

public interface ObjectCommand 
{ 
    public void execute(Object object); 
} 

И один, что делает выполнить обратный метод что-то:

public interface ObjectToArrayCommand 
{ 
    public Object[] execute(Object object); 
} 

мне было интересно, если я мог бы объединить эти два различных интерфейса в одном интерфейсе, или как один и тот же интерфейс суперкласса с использованием дженерик и/или наследования, например, что-то вроде:

public interface Command<T,U> 
{ 
    public U execute(T t); 
} 

у меня есть проблема с этой схемой является то, что я Cann o сделать параметр «U» «void/no object». Есть ли другой способ?

Я знаю, что могу использовать подклассы для предоставления параметров, которые являются БОЛЕЕ конкретными, например, «Объект» может стать «String» в подклассе, и он все равно будет компилироваться. Но опять же, «Объект» не может стать «недействительным».

Причина, по которой я хочу объединить эти два интерфейса в один интерфейс, потому что это проще (концептуально говоря), если команда EVERY реализует один и тот же интерфейс вместо двух (или более) типов команд, которые используются вместе.

ответ

3

Что вы ищете является java.lang.Void, заполнитель для пустот ключевого слова

public interface ObjectCommand 
{ 
    public void execute(Object object); 
} 


public interface ObjectToArrayCommand 
{ 
    public Object[] execute(Object object); 
} 

может быть объединен в

public interface Command<T, U> { 
    public U execute(T t); 
} 

class CheckGenerics { 

    public static void main(String[] args) { 

     Command<Object, Class<Void>> command1 = new Command<Object, Class<Void>>() { 

      @Override 
      public Class<Void> execute(Object t) { 

       return Void.TYPE; 

      } 
     }; 

     Command<Object, Object[]> command2 = new Command<Object, Object[]>() { 

      @Override 
      public Object[] execute(Object t) { 

       return new Object[] { t }; 
      } 

     }; 

     Class<Void> a = command1.execute(new Object()); 
     System.out.println(void.class == a); // prints true 

     Object[] b = command2.execute(new Object()); 
     System.out.println(b); 

    } 

Проверьте документацию Пустоты класса here, то Javadoc утверждает, что

The Void class is an uninstantiable placeholder class to hold a reference to the Class object representing the Java keyword void.. Заметьте, чтоКлассне может быть создан, что мы хотим

 Смежные вопросы

  • Нет связанных вопросов^_^