在对象工厂中键入不匹配

时间:2011-10-07 08:09:15

标签: java design-patterns

我正在使用一个非常简单的工厂类来创建一些初始化我的对象:

   public class MyFactory {
      public static Superclass createObject(String type) {
         Superclass myObject = null;
         if (type.equals("type1")) {
            myObject = new Subclass();
            myObject.setParam("val1");
         }
         return myObject;
      }
   }

不那么复杂:-)没有通用代码等,只有这样。然而,如果我以这种方式使用我的工厂,我会在Eclipse中遇到类型不匹配错误:

Subclass myObj = MyFactory.createObject("type1");

错误说它不能从Superclass转换为Subclass,但是我看的每个地方(Heads First Design Patterns等)我都可以这样看:返回类型为创建的子类的超类...那么为什么我得到这个错误:-)?谢谢!

5 个答案:

答案 0 :(得分:2)

  

错误说它无法从超类转换为子类

没错。这与您在Number中存储Integer的原因相同(Number实际上可能是Double!)

如果您知道Subclass返回ProbeFactory.createProbe("type1"),那么您可以像这样投出:

Subclass myObj = (Subclass) ProbeFactory.createProbe("type1");

如果可能,应避免向下铸造。您可以设计它以便使用

Superclass myObj = ProbeFactory.createProbe("type1");

或者您可以尝试创建工厂的类型安全版本:

Subclass myObj = ProbeFactory.createSubProbe("type1");

答案 1 :(得分:1)

您可以明确地将返回值强制转换为Subclass,一旦工厂返回另一个Subclass Superclass,它将失败并在运行时抛出异常。 因此,不要这样做。

更合适的方法是将myObj声明为类型Superclass,并让界面包含您需要的方法。如果您需要知道返回的确切子类型,使用工厂模式有点毫无意义。

答案 2 :(得分:0)

反过来说。如果你得到SubClass,你可以将它分配给SuperClass变量(如果我们假设SubClass扩展了SuperClass)。

答案 3 :(得分:0)

由于该方法返回Superclass,您无法直接将其分配给子类。

你需要使用它或输入。

Superclass myObj = ProbeFactory.createProbe("type1");

Subclass myObj = (Subclass) ProbeFactory.createProbe("type1");

答案 4 :(得分:0)

通常你想要同样对待同一工厂的对象,这就是为什么创建Superclass以具有所有常见行为的原因。如果你真的想要使用它们特定于类,那么,是的,你应该进行强制转换。但我觉得这样会破坏抽象工厂的目的。

如果您想要特定产品或产品组,则在将工厂分类并从子工厂接收时