Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
类的Java通用枚举器_Java_Generics_Enums - Fatal编程技术网

类的Java通用枚举器

类的Java通用枚举器,java,generics,enums,Java,Generics,Enums,我想创建一个带有类的枚举器,以便在进一步的代码中获得这些类,但我不能。 我将举例说明我想做什么: public enum SomeEnumeratorForClasses { FIRST_CLASS( "Name 1", FirstClass.class ), SECOND_CLASS( "Name 2", SecondClass.class ); private String name; private Class<T> response; SomeEnum

我想创建一个带有类的枚举器,以便在进一步的代码中获得这些类,但我不能。 我将举例说明我想做什么:

public enum SomeEnumeratorForClasses {
  FIRST_CLASS( "Name 1", FirstClass.class ),
  SECOND_CLASS( "Name 2", SecondClass.class );

  private String name;
  private Class<T> response;

  SomeEnumeratorForClasses ( String name, Class<T> clazz ) {...}

  public Class<T> getResponse() {
    return response;
  }
}
最后,在另一节课上,我想要这样的东西:

SomeEnumeratorForClasses.FIRST_CLASS.getResponse().getDescription();
但我做不到。每个类从其他基类零继承。类示例:

FirstClass extends Zero
SecondClass extends Zero
我也试着这样做

private Class<T> response;
有些方法(如GetDescriptions)在Zero类中是抽象的。
我该怎么做?

如果您知道每个类共享一个构造函数签名(最好是一个公共的无参数版本),那么您可以编写一个函数来实例化它们

public class ObjectUtils {
    private ObjectUtils(){}

    public static <T> T init(Class<T> clazz, Object... args) {
        try {

            return (T) Arrays.stream(clazz.getConstructors())
                    .filter(construct -> Objects.equals(args.length, construct.getParameterCount()))
                    .filter(construct -> IntStream.range(0, construct.getParameterTypes().length)
                            .allMatch(val -> construct.getParameterTypes()[val].isAssignableFrom(args[val].getClass())))
                    .findFirst().orElseThrow(() -> new InstantiationException("Could not find compatible constructor."))
                    .newInstance(args);

        } catch (InstantiationException | InvocationTargetException | IllegalAccessException e) {
            throw new RuntimeException("Could not instantiate class for provided arguments.", e);
        }
    }
}

它不是静态方法,是公共字符串方法。您的
getDescription
是否在
Zero
类中声明?它是您希望通过此枚举访问的唯一方法吗?如果它不是静态的,那么要调用它,您需要调用它的实例(就像getter需要从中读取它需要返回的值的实例),而不是类文本。If
getResponse()
返回一个
,然后您将无法调用该类上的任何自定义方法(如
getDescription()
)-这些是该类的实例方法,您需要一个对象,而不是
。Adam Michalik:那么getResponse()应该返回该类的实例吗?
private Class<? extends Zero> response;
class FirstClass {
  public String getDescription() {
    return "Text";
  }
}
public class ObjectUtils {
    private ObjectUtils(){}

    public static <T> T init(Class<T> clazz, Object... args) {
        try {

            return (T) Arrays.stream(clazz.getConstructors())
                    .filter(construct -> Objects.equals(args.length, construct.getParameterCount()))
                    .filter(construct -> IntStream.range(0, construct.getParameterTypes().length)
                            .allMatch(val -> construct.getParameterTypes()[val].isAssignableFrom(args[val].getClass())))
                    .findFirst().orElseThrow(() -> new InstantiationException("Could not find compatible constructor."))
                    .newInstance(args);

        } catch (InstantiationException | InvocationTargetException | IllegalAccessException e) {
            throw new RuntimeException("Could not instantiate class for provided arguments.", e);
        }
    }
}
public enum SomeEnumeratorForClasses {
  FIRST_CLASS( "Name 1", FirstClass.class ),
  SECOND_CLASS( "Name 2", SecondClass.class );

  private String name;
  private Class<? extends Zero> responseClass;

  SomeEnumeratorForClasses ( String name, Class<? extends Zero> responseClass ) {
       this.name = name;
       this.responseClass = responseClass;
  }

  public <T extends Zero> T getResponse() {
    return ObjectUtils.init(responseClass);
  }
}
SomeEnumeratorForClasses.FIRST_CLASS.getResponse().getDescription();