【问题标题】:Combining different types of command interfaces using generics/inheritance使用泛型/继承组合不同类型的命令接口
【发布时间】:2014-09-07 12:21:37
【问题描述】:

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

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

这个方案的问题是我不能将参数“U”设为“void/no object”。还有其他方法吗?

我知道我可以使用子类来提供更具体的参数,比如“Object”可以在子类中变成“String”并且它仍然可以编译。但同样,“对象”不能变成“无效”。

我想将这两个组合成一个接口的原因是因为如果每个命令都实现相同的接口而不是同时使用两种(或更多)类型的命令,它会更容易(从概念上讲)。

【问题讨论】:

    标签: java generics inheritance interface command-pattern


    【解决方案1】:

    你正在寻找的是 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类不能被实例化,这正是我们想要的

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-05
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      • 2019-06-25
      • 1970-01-01
      相关资源
      最近更新 更多