2011-10-07 31 views
2

我用一个非常简单的工厂类创建一个初始化一些我的对象:在对象工厂的类型不匹配

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

错误说,它不能从父类转换成子类,但到处看(头设计模式等),我可以看到它这样:返回作为类型的创建子类的超类......所以,为什么我得到这个错误:-)?谢谢!

+0

@Vakimshaar接受它是绝对:-) – strauberry

回答

2

错误说,它不能从超类转换为子类

这是正确的。这是同样的原因,你不能存储NumberInteger的实例(Number实际上可能是一个Double!)

如果您知道SubclassProbeFactory.createProbe("type1")返回,那么你可以施放它是这样的:

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

向下铸造应尽量避免。要么你设计它,这样就可以与

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

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

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

确定,以及如何正确地做到这一点?正如我所说/写的,我发现它只有这样,即使在我的书中......我的误解在哪里? – strauberry

+0

感谢您的解释,我认为类型转换不是实现此目的的最佳方式:-)我会考虑它,谢谢! – strauberry

+0

没问题。别客气。 – aioobe

0

它周围的其他方法。如果您得到​​,您可以将其分配给SuperClass变量(如果我们假设SubClass扩展了SuperClass)。

0

由于该方法返回超类,你不能直接将其分配给一个子类。

你需要使用这个或类型转换。

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

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

不幸的是,这会抛出“java.lang.ClassCastException:超类不能被转换为子类”。 –

+0

如果您知道子类正在返回,它不会。 – Jayendra

+0

但在这种情况下,演员不再需要。 –

1

你可以返回值显式地转换为Subclass的工厂返回的Superclass另一Subclass和运行时会抛出一个异常,就会失败。 因此,不要这样做。

更合适的方法是将myObj声明为Superclass,并且该接口包含您所需的方法。如果您需要知道返回的确切子类型,则使用工厂模式是没有意义的。

+0

我会考虑它,也许不要使用工厂或更复杂的工具:-) – strauberry

0

通常你想同样对待同一个工厂的对象,这就是为什么创建超类的所有常见行为的原因。如果你真的想要使用它们的类特定,那么,是的,你应该做的演员。但我觉得它会杀死抽象工厂的目的。

如果你想要一个特定的产品或一组产品子类时,你的工厂,并从孩子工厂