java - 避免在通用工厂方法中出现 ClassCastException

标签 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

最佳答案

您可以为 BC 添加一个 createChain:

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

关于java - 避免在通用工厂方法中出现 ClassCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23901814/

相关文章:

java - 如何在静态类中加载字体并用作 JAR

java - 当 location==null 时更改按钮的可见性

python - API 中对象启动的 OO 设计模式

c# - 泛型类型参数和类型

Java:检查泛型是否为 int

Java XStream Deep Copy 引发异常 ObjectAccessException

java - 编写一个程序来标记无向图的连通分量

javascript - 这些原型(prototype)声明有什么区别?

c++ - 为什么要使用未命名的命名空间,它们有什么好处?

generics - 使用通用函数不适用于使用 jackson 加载 YAML 列表