首页 > 解决方案 > Java - 通用的工厂类

问题描述

这是一个Java代码结构:

public interface MyBaby<T> {...}

public class A implements MyBaby<Foo> {...}

public class B implements MyBaby<Boo> {...}

public Class Foo {...}

public Class Boo {...}

public class MyFactory {

  ...
  public synchronized static MyFactory getInstance() {...}

  public MyBaby<?> getMyBaby(BabyType type) {...}
}
  

上面的代码结构有点问题。要有一个实例,我需要进行向下转换,例如

MyBaby<Foo> baby = (MyBaby<Foo>) MyBabyFactory.getInstance().getMyBaby(BabyType.CUTE);

如何更改代码以便不需要向下转换?

标签: javagenerics

解决方案


你应该像这样传递一个Class对象。

public <T> MyBaby<T> getMyBaby(Class<T> type) {
    return (MyBaby<T>) (type == Foo.class ? new A() : new B());
}

    MyBaby<Foo> a = MyFactory.getInstance().getMyBaby(Foo.class);  // OK
    MyBaby<Foo> b = MyFactory.getInstance().getMyBaby(Boo.class);  // Compile error

推荐阅读