类的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需要从中读取它需要返回的值的实例),而不是类文本。IfgetResponse()
返回一个类
,然后您将无法调用该类上的任何自定义方法(如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();