使用泛型/继承组合不同类型的命令接口

时间:2014-09-07 12:21:37

标签: java generics inheritance interface command-pattern

我使用命令模式将逻辑封装在"命令"对象。我目前有两种类型的命令接口:

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

使execute方法返回的东西:

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

我想知道我是否可以将这两个不同的接口组合到一个接口中,或者使用泛型和/或继承共享相同的超类接口,例如:

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

我对这个方案的问题是我不能制作参数&#34; U&#34; be&#34; void / no object&#34;。还有另一种方式吗?

我知道我可以使用子类来提供更具体的参数,例如&#34; Object&#34;可以成为&#34; String&#34;在子类中它仍然会编译。但同样,&#34;对象&#34;不能成为&#34;无效&#34;。

我想将这两者合并为一个界面的原因是因为如果EVERY命令实现相同的接口而不是一起使用两种(或更多)类型的命令,则更容易(概念上讲)。

1 个答案:

答案 0 :(得分:3)

您所看到的是java.lang.Void,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);

    }

检查Void Class here的文档,javadoc说明

The Void class is an uninstantiable placeholder class to hold a reference to the Class object representing the Java keyword void. 。注意Void类无法实例化,这正是我们想要的