在Generic Factory方法中避免使用ClassCastException

时间:2014-05-28 02:18:13

标签: java oop generics design-patterns

我有一个抽象类A.几乎没有更多抽象类扩展A,比如说B,C。现在我有一些扩展B,C的具体类。所以情况看起来像:

abstract class A;
abstract class B extends A;
abstract class C extends A;
class B1 extends B;
class B2 extends B;
class C1 extends C;
class C2 extends C;

B1,B2,C1,C2是chain of responsibility pattern中的链接,它们必须在一个订单中。所以,我有一个定义顺序的枚举。它看起来像:

Enum Order {
  B_ORDER    (B1.class, B2.class),
  C_ORDER    (C1.class, C2.class);

  Class<? extends A>[] chainOrder;
}

我有一个初始化这个链的工厂方法。它将chainOrder和Type作为输入,并返回相同类型链的头部。

<T extends A> T createChain(Class<? extends A>[] chainOrder, Class<? extends A> chainType) {
  // Test if all the classes in chainOrder is of same type given by chainType
  // Do some other stuff
}

问题是我可以避免工厂中的类型检查(即可以在编译时注意)吗?

如果没有,确保链包含相同类型链接的正确方法是什么。

欢迎任何其他设计建议。

PS:我们在JDK 1.7

1 个答案:

答案 0 :(得分:0)

您可以为createChainB添加一个C

<T extends A> T createChain(Class<? extends B>[] chainOrder)
<T extends A> T createChain(Class<? extends C>[] chainOrder)