java - Java 如何返回一个类依赖于指定参数的对象?

标签 java generics

我正在为支持不同类型小部件的网页编写测试代码,每个小部件我都用一个类表示(XWidget extends AbstractWidgetYWidget extends AbstractWidget等),我需要一种创建 Widget 对象的简单方法。理想情况下,它看起来像这样:

public static AbstractWidget getWidget(ObjectType widgetType) {
  //return some subclass of AbstractWidget
}
public enum ObjectType {
  X(XWidget.class), Y(YWidget.class);
  //include constructor etc.
}

我目前有一个看起来相当困惑的实现,其中涉及将 Class 对象作为参数传递(请参见下面的示例),但这并不是最好的方法。

public static <T extends AbstractWidget<?>> T getWidget(Class<T> objectType) {
  try {
    return objectType.getConstructor(new Class[] {WebElement.class}).newInstance(/*some WebElement*/);
  } catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException e) {
    e.printStackTrace();
  }
  return null;
}
public <T extends AbstractWidget<?>> T createWidget(Class<T> objectType) {
  //create widget of type objectType
  return getWidget(objectType);
}

任何帮助让泛型东西(我不太理解)工作的帮助都将不胜感激,甚至只是一种完全不同的方法。

最佳答案

您可以让枚举负责实例化小部件:

public static AbstractWidget getWidget(ObjectType widgetType) {
    return widgetType.instantiate();
}

public enum ObjectType {
    X {
        @Override
        XWidget instantiate() {
            return new XWidget();
        }
    },
    Y {
        @Override
        YWidget instantiate() {
            return new YWidget();
        }
    };
    abstract AbstractWidget instantiate();
}

关于java - Java 如何返回一个类依赖于指定参数的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34178954/

相关文章:

java - 旋转屏幕后, View 寻呼机保留旧 fragment

java - 具有类型转换的通用原始类型

java - JPA Base64 生成器

java - Spring Boot - 依赖项的初始化顺序

java - 通用接口(interface) - Java

Java:声明具有两个相关泛型类型的映射 (<T> Map<Class<? extends ClassA<T>>,Class<? extends ClassB<T>>>)

Java- <T extends Comparable<T>> 的含义?

java - 如何在java中声明通用键值对数组

java - 耦合与内聚设计

Mac Snow Leopard 上的 Java 安全文件位置