java - 如何实例化泛型类并调用方法

标签 java generics switch-statement

现在我有 4 个类,根据下面示例中给出的情况,它们具有要调用的通用方法。

Class1 class1 = new Class1();
Class1 class2 = new Class2();
Class1 class3 = new Class3();
Class1 class4 = new Class4();

MyEnum enum = MyEnum.valueOf(getString()); //getString() will return String "c1" or "c2" or ....

switch(s)
{
case c1 :
class1.add();
break;
case c2 :
class2.add();
break;
case c3 :
class3.add();
break;
case c4 :
class4.add();
break;
}

由于以后有可能出现新类,所以我想让类初始化和方法调用通用。请让我知道实现它的最佳方法。预先感谢您的建议。

最佳答案

我认为这是一个正确的方法(没有泛型):

public interface ICommon {
   public void add();
}

那么Class1,Class2,Class3,...应该实现ICommon接口(interface)。

因此,我建议您创建一个像这样的 ClassFactory:

public class ClassFactory {

public static ICommon getInstance() {
... //do here whatever it takes to create a concrete instance of ICommon
}

最后,它看起来像这样:

ICommon someClass = ClassFactory.getInstance();
someClass.add();

}

编辑:

您可以将其添加到您的ClassFactory中,而不是使用switch语句:

public class ClassFactory {

    private static HashMap<String, String> mClassMapping = new HashMap<String, String>();

    public static void registerClass(Class<?> clazz, String tag) {
        String name = clazz.getName();
        mClassMapping.put(tag, name);
    }

    public static ICommon getInstance(String tag) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
        String className = mClassMapping.get(tag);

        if  (null == className) {
            throw new ClassNotFoundException(String.format("There is no class registered for tag: %s", tag));
        }

        Class<?> aClass = Class.forName(className);

        return (ICommon)aClass.newInstance();
    }
}

最后你可以这样做: 在某个起点注册您的类(class):

ClassFactory.registerClass(Class1.class, "c1");
ClassFactory.registerClass(Class2.class, "c2");
...

然后获取一个像这样的实例:

String tag = ...//get tag associated to the class somehow; 

ICommon classInstance = ClassFactory.getInstance(tag);   //i.e tag == "c1"
classInstance.add();

关于java - 如何实例化泛型类并调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22163978/

相关文章:

java - 如何为其他泛型类声明抽象泛型父类(super class)?

c# - Winforms IoC 容器 - 如何使用 Presenter 工厂处理具体类型

c++ - 如何随机化开关?

c++ - 软件版本中添加新参数时如何处理 "switch/case"

java - 为 Lombok 创建自定义注释

java - 如何访问子类对象中抽象类中私有(private)属性的值?

java - 抽象方法在抽象类或接口(interface)中定义时有何不同?

java - GraphQL Spring-boot 查询过滤

c# - 为什么嵌套公共(public)类比它的父类更难访问?

Android:无论所选项目如何,与 OnItemClickListener() 一起使用的 Switch 语句始终选择最后一种情况