我使用命令模式将逻辑封装在"命令"对象。我目前有两种类型的命令接口:
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命令实现相同的接口而不是一起使用两种(或更多)类型的命令,则更容易(概念上讲)。
答案 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
类无法实例化,这正是我们想要的